1 / 48

3.3.2 算术运算指令

3.3.2 算术运算指令. 涉及 两种类型数据 : 无符号数 和 有符号数 。对加减法指令,无符号和有符号数可采用 同一套指令 ,但应 注意: 参加的操作数必须 都是 无符号数或 都是 有符号数。 需使用不同的标志位 ( CF,OF ) 来检查无符号数和有符号数的运算结果是否溢出。 这类指令 一般都 影响标志寄存器 FLAGS 。. 表 4 - 2 算术运算类指令表. 无符号数范围 0~255 带符号数范围 -128~127. 两个 8 位数相加时有 4 种情况:.

marged
Download Presentation

3.3.2 算术运算指令

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 3.3.2 算术运算指令 涉及两种类型数据: 无符号数和有符号数。对加减法指令,无符号和有符号数可采用同一套指令,但应注意: • 参加的操作数必须都是无符号数或都是有符号数。 • 需使用不同的标志位(CF,OF)来检查无符号数和有符号数的运算结果是否溢出。 • 这类指令一般都影响标志寄存器FLAGS。

  2. 表4 - 2 算术运算类指令表

  3. 无符号数范围0~255 带符号数范围-128~127 • 两个8位数相加时有4种情况: • ①无符号数和有符号数均不溢出 • 二进制相加 无符号数加 有符号数加 • 0000 1000 8 +8 • +0001 1110+ 30+ (+30) • 0010 0110 38 +38 • 结果38 CF=0 OF=0

  4. ② 无符号数溢出 无符号数 有符号数 0000 1000 8 +8 +1111 1101+253+(-3) 10000 0101 261 +5 结果5 CF=1 OF=0 ③ 有符号数溢出 0000 1000 8 +8 +0111 1101+125+(+125) 1000 0101 133 +133 结果-123 CF=0 OF=1 (补码表示)

  5. ④ 无符号数和有符号数均溢出 无符号数 有符号数 1000 1000 136 -120 +1111 0111+247+(-9) 10111 1111 383 -129 结果127 CF=1 OF=1 上面四种情况说明, CF标志可用来表示无符号数的溢出, OF标志可用来表示有符号数的溢出。 有符号数的溢出是一种出错状态,在运算过程中应当避免。

  6. 所有的算术运算指令,都会影响FLAGS标志寄存器的6个状态标志CF/OF/ZF/SF/AF/PF(3个控制标志IF/DF/TF不受影响)。所有的算术运算指令,都会影响FLAGS标志寄存器的6个状态标志CF/OF/ZF/SF/AF/PF(3个控制标志IF/DF/TF不受影响)。 • 总的讲,有这样一些规则: 当无符号数运算产生溢出(即最高位向前有进位 或借位)时,CF=1,否则为0; 当有符号数运算产生溢出时,OF=1(即OF=CF⊕CF-1) , 否则为0; 当运算结果为0时,ZF=1 ,否则为0; 当运算结果为负数时,SF=1 ,否则为0; 当运算一半位置有进位或借位时,AF=1 ,否则为0;   当运算结果中有偶数个1时,PF=1 ,否则为0。

  7. 共有5条: (1) 不带进位的加法指令ADD 格式: ADD acc,data ADD mem/reg,data ADD mem/reg1,mem/reg2 注:1.源和目的操作数不能同时为存储器操作数 2.不能把段寄存器作为操作数 例:ADD AL,30H ADD AX,[BX+20H] ADD CX,SI ADD [DI],200H ADD指令对标志位(指6个状态标志)都有影响。 1.加法指令

  8. (2) 带进位位的加法指令ADC ADC指令在形式上和功能上都有与ADD类似,只是相加时还要包括进位标志CF的内容。 例如: ADC AL,68H ;AL←(AL)+68H+(CF) ADC AX,CX ;AX←(AX)+(CX)+(CF) ADC BX,[DI] ;BX←(BX)+[DI+1][DI]+(CF)

  9. 例:有两个4字节的无符号数相加: 2C 56 F8 AC + 30 9E 47 BE = ? 设被加数、加数分别存放在BUFFER1及BUFFER2开始的两个存储区内,结果放回BUFFER1存储区,如下页图所示。 因CPU只能进行8位或16位的加法运算,为此可将加法分4次进行。 ADC指令主要用于多字节加法运算中

  10. BUFFER1 ACH 被加数 F8H 56H 2CH 数据段 ... BUFFER2 BEH 47H 加数 9EH 30H ... 多字节加法示意图

  11. 程序段如下: MOV CX,4 ;置循环次数 MOV SI,0 ;置SI初值为零 CLC ;清进位标志CF LL: MOV AL,BUFFER2[SI] ADC BUFFER1[SI],AL ;带进位加 INC SI ;(SI)+1 DEC CX ;(CX)-1 JNZ LL ;若(CX)0,则转LL 思考:若最高位有进位,如何改?

  12. 1 结果为负 0 否则 1 结果为0 0 否则 1 和的最高有效位有向高位的进位 0 否则 1 两个操作数符号相同,而结果符号与之相反 0 否则 SF= ZF= CF= OF= ADD/ADC指令对条件标志位(CF/OF/ZF/SF)的影响: CF位表示无符号数相加的溢出。 OF位表示带符号数相加的溢出。

  13. 格式:INC reg/mem 功能:类似于C语言中的++操作:对指定的操作数加1 例: INC AL INC SI INC BYTE PTR[BX+4] 注意:本指令不影响CF标志,但对AF/OF/PF/SF/ZF会产生影响。 3) 加1指令INC(单操作数指令)

  14. (1) 不考虑借位的减法指令SUB 格式:SUB dest, src 操作: dest←(dest)-(src) 注:1.源和目的操作数不能同时为存储器操作数 2.不能把段寄存器作为操作数 指令例子: SUB AL,60H SUB [BX+20H],DX SUB AX,CX 2. 减法指令

  15. SBB指令主要用于多字节的减法。 格式:SBB dest, src 操作: dest←(dest)-(src)-(CF) 指令例子: SBB AX,CX SBB WORD PTR[SI],2080H SBB [SI],DX (2) 考虑借位的减法指令SBB

  16. 例:x、y、z均为32位数,分别存放在地址为X, X+2;Y,Y+2;Z,Z+2的存储单元中,用指令序列实现wx+y+24-z,结果放在W, W+2单元中。 • MOV AX, X • MOV DX, X+2 • ADD AX, Y • ADC DX, Y+2 ; x+y • ADD AX, 24 • ADC DX, 0 ; x+y+24 • SUB AX, Z • SBB DX, Z+2 ; x+y+24-z • MOV W, AX • MOV W+2, DX ; 结果存入W, W+2单元

  17. 作用类似于C语言中的”--”操作符。 格式:DEC opr 操作:opr←(opr)-1 指令例子: DEC CL DEC BYTE PTR[DI+2] DEC SI (3) 减1指令DEC 注:该指令与INC一样,它不影响CF标志,但对AF/OF/PF/SF/ZF会产生影响。

  18. 格式:NEG opr 操作: opr← 0-(opr) 对一个操作数取补码相当于用0减去此操作数,故利用NEG指令可得到负数的绝对值。 例: 若(AL)=0FCH,则执行 NEG AL 后, (AL)=04H,CF=1 本例中,0FCH为-4的补码,执行求补指令后,即得到4(-4的绝对值)。 (4) 求补指令NEG

  19. 1 被减数的最高有效位有向高位的借位 0 否则 1 两个操作数符号相反,而结果的符号与减数相同 0 否则 CF= OF= SUB/SBB指令对标志位(CF/OF/ZF/SF)的影响: CF=1表示无符号数减法溢出。 OF=1表示带符号数减法溢出。 NEG指令对CF/OF的影响: CF:操作数为0时,求补的结果使CF=0,否则CF=1。 OF:字节运算对-128求补或字运算对-32768求补时OF=1, 否则OF=0。

  20. 格式:CMP dest, src 操作: dest←(dest)-(src) (而 SUB dest, src; dest←(dest)-(src) ) CMP也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上。 指令例子: CMP AL,0AH CMP CX,SI CMP DI,[BX+03] (5) 比较指令CMP

  21. 根据标志位来判断比较的结果 1)根据ZF判断两个数是否相等。若ZF=1,则两数相等。 2)若ZF=0,则两个数不相等,则分两种情况考虑: ①比较的是两个无符号数 若CF=0,则dest>src; 若CF=1,则dest<src。 ②比较的是两个有符号数 若OF⊕SF=0,则dest>src; 若OF⊕SF=1,则dest<src。

  22. 比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。 举例:比较AL、BL、CL中带符号数的大小,将 最小数放在AL中。 程序: CMP AL,BL ;AL和BL比较 JNG BBB;若AL≤BL,则转 XCHG AL,BL ;若AL>BL,则交换 BBB: CMP AL,CL ;AL和CL比较 JNG CCC ;若AL≤CL,则转 XCHG AL,CL ;若AL>CL,则交换 CCC: HLT 思考:程序的结果? (AL、BL、CL中数据的大小顺序)

  23. 进行乘法时: 8位  8位→ 16位乘积 (即 AL  mem8/reg8→ AX) 16位  16位→ 32位乘积 (即 AX  mem16/reg16→ DX AX) (1)无符号数的乘法指令MUL mem/reg 格式: MUL src 操作:字节操作数 (AX)  (AL) × (src) 字操作数 (DX, AX)  (AX) × (src) 指令例子: MUL BL ;(AL)×(BL),乘积在AX中 MUL CX ;(AX)×(CX),乘积在DX,AX中 MUL BYTE PTR[BX] 3. 乘法指令

  24. 格式与MUL指令类似,只是要求两操作数均为有符号数。 指令例子: IMUL BL ;(AX)←(AL)×(BL) IMUL WORD PTR[SI] ;(DX,AX)←(AX)×([SI+1][SI]) (2)有符号数乘法指令IMUL 注意:MUL/IMUL指令中 ● AL(AX)为隐含的乘数寄存器; ●AX(DX,AX)为隐含的乘积寄存器; ●SRC不能为立即数; ● 除CF和OF外,对其它标志位无定义。

  25. 00 乘积的高一半为零 11 否则 MUL指令: CF/OF = 00 乘积的高一半是低一半的符号扩展 11 否则 IMUL指令: CF/OF = MUL/IMUL乘法指令对CF/OF的影响: 例:(AL) = A5H(-5B),(BL) = 11H (1) IMUL BL ; (AX)  (AL)×(BL) ; A5×11  -5B×11=-060B  F9F5 ; (AX) = F9F5HCF=OF=1 (2) MUL BL ; (AX)  (AL)×(BL) ; A5×11= 0AF5 ; (AX) = 0AF5HCF=OF=1

  26. 4. 除法指令 • 进行除法时:16位/8位 → 8位商及8位余数 32位/16位 →16位商及16位余数 • 对被除数、商及余数存放有如下规定: 被除数 商 余数 字节除法 AX AL AH 字除法 DX:AX AX DX

  27. 格式: DIV src 操作:字节操作 (AL)  (AX) / (src) 的商 (AH)  (AX) / (src) 的余数 字操作 (AX)  (DX, AX) / (src) 的商 (DX)  (DX, AX) / (src) 的余数 指令例子: DIV CL DIV WORD PTR[BX] 注:若除数为零或AL中商大于FFH(或AX中商大于FFFFH),则CPU产生一个类型0的内部中断。 (1)无符号数除法指令DIV

  28. (2)有符号数除法指令IDIV 格式:IDIV src 操作与DIV类似。商及余数均为有符号数,且余数符号总是与被除数符号相同。 CBW与CWD两指令主要用于被除数扩展 注意:对于DIV/IDIV指令 • AX(DX,AX)为隐含的被除数寄存器。 • AL(AX)为隐含的商寄存器。 • AH(DX)为隐含的余数寄存器。 • src不能为立即数。 • 对所有FLAGS的状态标志位均无定义。

  29. 关于除法操作中的字长扩展问题 • 运算要求被除数字长是除数字长的两倍,若不满足则需对被除数进行扩展,否则产生错误。 8位16位 16位32位 ALAX(AH AL) AXDX AX • 对无符号数除法扩展,只需将AH或DX清零即可。 • 对有符号数而言,则是符号位的扩展。可使用符号扩展指令CBW和CWD

  30. 例:写出两带符号数34H÷25H的程序段。 MOV AL,34H MOV BL,25H CBW ; AL的符号扩展到AH IDIV BL ; 0034H÷25H,结果为 ; (AH)=0FH, (AL)=01H

  31. *5.BCD码运算的十进制调整指令 • 专用于对BCD码运算的结果进行调整 • 包括:AAA、DAA、AAS、DAS、AAM、AAD • 均为隐含寻址,隐含的操作数为AL和AH • 为何要对BCD码的运算结果进行调整? BCD码本质上是十进制数,即应遵循逢十进一的规则。而计算机是按二进制(十六进制)进行运算,并未按十进制规则进行运算。

  32. 1)加法的十进制调整指令 (1)非压缩BCD码加法调整AAA 本指令对在AL中的由两个未组合的BCD码相加后的结果进行调正,得到一个正确的未组合的BCD码。 注意: • AAA指令只影响AF和CF,其余标志无定义。 • AAA指令应紧跟在ADD或ADC指令之后。

  33. 如果AL的低4位>9∨AF=1,则: ① AL←(AL)+6,(AH)←(AH)+1,AF←1 ② AL←((AL)∧0FH) ③ CF←AF 否则AL←(AL)∧0FH AAA指令的操作如下:

  34. 调整原理:先看一个例子 计算8+90000 1000 +0000 1001 0001 0001 = 11 而计算机相加为11,原因在于运算过程中,如遇到低4位往高4位产生进位时(此时AF=1)是按逢十六进一的规则,但BCD码要求逢十进一,因此只要产生进位,个位就会少6,这就要进行加6调正。 这个1代表了16,而实际上仅应为10,即多进了6。

  35. 实际上当低4位的结果>9(即A~F之间)时,也应进行加6调正 (原因是逢十没有进位,故用加6的方法强行产生进位) 。 如对上例的结果进行加6: 0001 0001 11 + 0000 01106 0001 0111(压缩式) 17 ∧ 0000 1111 ---------------------- 0000 0001 0000 0111(非压缩式) 调整方法: 如果AL的低4位>9∨AF=1,则: ① AL←(AL)+6,(AH)←(AH)+1,AF←1 ② AL←((AL)∧0FH) ③ CF←AF 否则AL←(AL)∧0FH

  36. 例2:有两个字符串形式的十进制数,2658和 3619,求二者之和。即2658+3619=? 由题意知,被加数和加数的每一位都以ASCII码(与非压缩BCD码区别)形式存放在内存中。 假定二数在内存中均是低位在前,高位在后,另留出5个单元存放相加的结果。 内存中数据存放形式见下页图。

  37. SI STRING1 38H ‘8’ 被加数 35H ‘5’ 36H ‘6’ 非压缩BCD码 3改为0 CX 32H ‘2’ ... DI STRING2 ‘9’ 数据段 39H 加数 31H ‘1’ 36H ‘6’ CX 33H ‘3’ ... SUM BX 结果 CX

  38. 程序段为: LEA SI,STRING1 ;STRING1偏移地址送SI LEA DI,STRING2 ;STRING2偏移地址送DI LEA BX,SUM ;SUM偏移地址送BX MOV CX,4 ;循环4次 CLC ;清进位标志 AGAIN:MOV AL,[SI] ADC AL,[DI] ;带进位加 AAA;未压缩BCD码调正 MOV [BX],AL ;结果存入SUM INC SI ;调整指针 INC DI INC BX DEC CX ;循环计数器减1 JNZ AGAIN ;若未处理完,则转AGAIN

  39. 思考题: (1) 根据程序写出结果SUM的值。 (2) 若最高位有进位,程序如何修改? (3) 从此例不难看出,用AAA指令也可对字符串形式的十进制数加法进行调整,所以它又被称为加法的ASCII调正指令。 为什么AAA指令既可对非压缩BCD码加法进行调整,也可对ASCII码形式的十进制数进行调整?(注意AAA指令的第②步)

  40. (2)压缩BCD码加法调整DAA • 两个压缩BCD码相加结果在AL中,通过DAA调整得到一个正确的压缩BCD码. • 指令操作(调整方法): 若AL的低4位>9∨AF=1 则(AL)←(AL)+6,AF←1 若AL的高4位>9∨CF=1 则(AL)←(AL)+60H,CF←1 • DAA指令影响除OF外所有其它标志。 • DAA指令应紧跟在ADD或ADC指令之后。

  41. 例:48H+74H=?0100 1000 48 MOV AL,48H + 0111 010074 MOV BL,74H 1011 1100 BC ADD AL,BL + 0110 011066 DAA 1 0010 0010 1 22 (进位) (进位) 执行ADD后,(AL)=BCH,高4位低4位均大于9,故DAA指令执行加66H调整,最后结果为: (AL)=22H, CF=1, AF=1

  42. (1)非压缩BCD码减法的十进制调正指令AAS 对AL中由两个非压缩的BCD码相减的结果进行调整。 调整操作为: 若AL的低4位>9或AF=1,则: ① AL←(AL)-6,AH←(AH)-1,AF←1 ② AL←(AL)∧0FH ③ CF←AF 否则:AL←(AL)∧0FH 2)减法的十进制调整指令

  43. 举例:16-8=? MOV AX,0106H 0000 0110 06 MOV BL,08H - 0000 1000- 08 SUB AL,BL 1111 1110 FE AAS - 0000 0110- 06 1111 1000 F8 ∧0000 1111∧0F 0000 1000 08 结果为:(AL)=08H,(AH)=0,CF=AF=1

  44. (2)压缩BCD码减法的十进制调正指令DAS 对AL中由两个压缩BCD码相减的结果进行调整。调整操作为: • 若AL的低4位>9∨AF=1,则: • AL←(AL)-6, 且AF←1 • 若AL的高4位>9∨CF=1,则: • AL←(AL)-60H,且CF←1 • 注意: • AAS、DAS对标志位的影响与AAA、DAA相同。 • AAS、DAS指令要求紧跟在减法指令SUB或SBB之后。

  45. 3)乘法的十进制调正指令AAM 对AX中由两个非压缩BCD码相乘的结果进行调整。调整操作为: (AL)/0AH, (AH)←商,(AL)←余数 注意: • 隐含的操作寄存器为AL和AH; • AAM紧跟在MUL指令之后使用; • 影响标志位PF、SF、ZF,其它无定义; • 用AAM可实现≤99的二-十进制转换。

  46. 例1:按十进制乘法计算7×8=? 程序段如下: MOV AL,07H ;(AL)=07H MOV CL,08H ;(CL)=08H MUL CL ;(AX)=0038H AAM ;(AH)=05H,(AL)=06H 所得结果为非压缩的BCD码。 例2:把3AH转换成等值的十进制数。 MOV AL,3AH ;58 AAM;(AH)=05H,(AL)=08H

  47. 4)除法的十进制调正指令AAD 对非压缩BCD除法运算进行调整。调整操作为: (AL)←(AH)×0AH+(AL) AH ← 0 注意: • 隐含的操作寄存器为AH,AL; • AAD要在DIV指令之前使用; • 影响标志位PF、SF、ZF,其它无定义; • 用AAD可实现≤99的十-二进制转换。

  48. 例1:按十进制除法计算55÷7=? 程序段如下: MOV AX, 0505H ;(AX)=55BCD MOV CL, 07H ;(CL)= 7 AAD ;(AX)=0037H DIV CL ;(AH)=6, (AL)=7 所得结果为非压缩的BCD码(商7余6)。 例2:把73转换成等值的二进制数。 MOV AX, 0703H ;(AX)= 73BCD AAD ;(AX)= 0049H

More Related