1 / 26

4.2.2 算术运算指令

4.2.2 算术运算指令. 算术运算指令 加法指令 (ADD 、 ADC 、 INC) 减法指令 (SUB 、 SBB 、 DEC 、 NEG 、 CMP) 乘法指令 (MUL 、 IMUL) 除法指令 (DIV 、 IDIV 、 CBW 、 CWD) 十进制调整指令 (DAA 、 DAS 、 AAA 、 AAS 、 AAM 、 AAD) 8086 提供加、减、乘、除四种基本算术操作。这些操作都可用于字节或字的运算,也可以用于带符号数与无符号数的运算。带符号数用补码表示。同时 8086 也提供了各种校正操作,故可以进行十进制算术运算。. 4.2.2 算术运算指令.

ardice
Download Presentation

4.2.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. 4.2.2 算术运算指令 • 算术运算指令 • 加法指令(ADD、ADC、INC) • 减法指令 (SUB、SBB、DEC、NEG、CMP) • 乘法指令(MUL、IMUL) • 除法指令(DIV、IDIV、CBW、CWD) • 十进制调整指令(DAA、DAS、AAA、AAS、AAM、AAD) • 8086提供加、减、乘、除四种基本算术操作。这些操作都可用于字节或字的运算,也可以用于带符号数与无符号数的运算。带符号数用补码表示。同时8086也提供了各种校正操作,故可以进行十进制算术运算。

  2. 4.2.2 算术运算指令 • 1.加法指令 • 不带进位的加法 ADD(add) • 格式:ADD OPRD1,OPRD2 • 功能:(OPRD1)(OPRD1)+(OPRD2) • 带进位的加法 ADC(add with carry) • 格式:ADC OPRD1,OPRD2 • 功能:(OPRD1)(OPRD1)+(OPRD2)+CF • 加 1 指令 INC(increment) • 格式:INC OPRD • 功能:(OPRD)(OPRD)+1(不影响CF) • 说明: • 源操作数:立即数、通用REG、M三种寻址方式;目的操作数:通用REG、M两种寻址方式,立即数不能做目的操作数。 • 源操作数,目的操作数不能同为存储器寻址方式,类型要一致,段寄存器不能做操作数。 • 这三条指令运算结果将影响状态标志位,但是INC指令不影响标志CF。

  3. 4.2.2 算术运算指令 • 例如: • ADDAL,50H ;AL和50H相加,结果放在AL中 • ADDDI,SI ;DI和SI的内容相加,结果放在DI中  • ADD [BX+DI],AX ;BX+DI和BX+DI+1两个存储单元的内容和AX中的内容 ;相加,结果放在BX+DI和BX+DI+1所指的存储单元中 • 例如: • ADCAX,SI ; AX和SI中的内容以及CF的值相加,结果放在AX中 • ADCDX,[SI] ; SI和SI+1所指的存储单元的内容和DX的内容以及CF ;的值相加,结果放在DX中 • 例如: • INCAL ; 将AL中的内容加1 • INCCX ; 将CX中的内容加1 • INCBYTE PTR[BX+DI+500] ; 将BX+DI+500所指的存储单元的内容加1

  4. 4.2.2 算术运算指令 • 2.减法指令 • 不带借位减法 SUB(subtract) • 格式:SUB OPRD1,OPRD2 • 功能:(OPRD1)(OPRD1)-(OPRD2) • 带借位减法 SBB(subtract with borrow) • 格式:SBB OPRD1,OPRD2 • 功能:(OPRD1)(OPRD1)-(OPRD2)-CF • 减 1 指令 DEC(decrement) • 格式:DEC OPRD • 功能:(OPRD)(OPRD)-1 • 求补指令 NEG(negate) • 格式:NEG OPRD • 功能:(OPRD)0-(OPRD) • 比较指令 CMP(compare) • 格式:CMP OPRD1,OPRD2 • 功能:(OPRD1)-(OPRD2)(只影响标志位,不回送结果,所影响的标志位见课本65页)

  5. 4.2.2 算术运算指令 • 例如: • SUBBX,CX ;将BX中的内容减去CX中的内容,结果放在BX中 • SUB[BP+2],CL ;将SS段的BP+2所指的单元中的值减去CL中的值,结 • ;果放在BP+2所指的堆栈单元中 • SUBAL,20 ;AL中的数减去20,结果放在AL中 • SUBWORD PTR [DI],1000H ;DI和DI+1所指的两单元中的数减去 ;1000H,结果放在DI和DI+1所指的 ;单元中 • 例如: • SBBAX,2030H ;将AX的内容减去立即数2030H,并减去进位位CF的值       • SBBWORD PTR [DI+2],1000H ;将DI+2和DI+3所指的两单元的内容 ;减去立即数1000H,并减去CF值, ;结果放在DI+2和DI+3所指的单元中

  6. 4.2.2 算术运算指令 • 例如: • DECAX ;将AX的内容减1,再送回AX中   • DECBL ;将BL的内容减1,结果送回BL中   • DECBYTE PTR [DI+2] ;将DI+2所指的单元的内容减1,结果送回此 ;单元 • 例如: • NEGAL ;将AL中的数取相反数,送回AL • NEGCX ;将CX中的数取相反数,送回CX • 例如: • CMPAX,2000H ;将AX的内容和2000H相比较,结果影响标志位 • CMPAL,50H ; 将AL中的数和50H比较,结果影响标志位 • CMPDX,DI ;将DX和DI的内容相比 • CMPAX,[BX+DI+100] ;将累加器和两个存储单元的数相比,单元地 ;址由BX+DI+100和BX+DI+101指出

  7. 4.2.2 算术运算指令 • 3.乘法指令 • 乘法运算是双操作数运算,但是,在指令中却只指定一个操作数,另一个操作数是隐含规定的。 • 其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为AL或AX。 • 指令格式: • 无符号数乘法MUL OPRD;字节乘法:(AX)(AL)* OPRD ;字乘法:(DX,AX)(AX)* OPRD • 带符号数乘法IMUL OPRD;操作同上 • 进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中。 • 进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。

  8. 4.2.2 算术运算指令 • 注意: • 乘法指令运算结果只影响状态标志CF、OF。 • 源操作数只能是通用REG或M寻址,不能是立即数。 • 只能是字节乘字节或字乘字。 • 存储器寻址时加类型说明,如 MUL BYTE PTR [BX] MUL WORD PTR [BX] • 例如: • MOV AL,0A3H ;(AL)=0A3H • MOV BL, 11H ;(BL)=11H • MUL BL ;(AX)=0AD3H

  9. 4.2.2 算术运算指令 • 4.除法指令 • 指令格式: • 无符号数除法 DIV OPRD • 带符号数除法 IDIV OPRD • 在除法运算中,如果除数是8位的,则要求被除数是16位的;如果除数是16位的,则要求被除数是32位的。

  10. 7 AH 0 7 AL 0 CBW 0 15 DX 0 15 AX CWD 4.2.2 算术运算指令 • 注意: • 当除数是字节数据时,被除数必须放在AX中;当除数是字数据时,被除数必须放在DX,AX中。 • 除法指令运算结果对状态标志无定义。 • 8086/8088规定IDIV指令运算结果余数的符号与被除数相同。 • 当被除数位数不够时,需扩展到所需的位数,带符号数需进行符号位扩展。 • 若商超出字或字节表示的范围,自动产生 0 号中断 • 符号扩展指令: • 字节扩展到字CBW;将寄存器AL中的符号位扩展到寄存器AH • 字扩展到双字CWD;将寄存器AX中的符号位扩展到寄存器DX

  11. 19 压缩BCD: 0001 1001 + 08 + 0000 1000 27 0010 0001 + 110 (0010 0111)BCD AF=1 4.2.2 算术运算指令 • 5.十进制(或BCD码)运算调整指令 • BCD码:用二进制编码的十进制数,又称二--十进制数 • 压缩的BCD码:用4位二进制数表示1位十进制数 • 例:(59)10=(0101 1001)BCD • 非压缩的BCD码:用8位二进制数表示1位十进制数 • 例:(59)10=(0000 0101 0000 1001)BCD • 问题的提出:

  12. 4.2.2 算术运算指令 • (1)压缩BCD码十进制调整指令 • 加法十进制调整指令DAA(Decimal Adjust Addition) • 功能:用于对两个压缩型BCD码相加之后的和(和必须放在AL中)进行调整,从而得到正确的压缩型BCD码。 • 调整方法: • 若(AL)低4位>9或AF=1,则(AL)+06H→(AL),并使AF=1 • 若(AL)高4位>9或CF=1,则(AL)+60H→(AL),并使CF=1 • 注意: • 隐含的操作寄存器为AL • 紧接在加法指令之后使用 • 影响除OF外的其余5个标志位

  13. 0101 1001 59 +)0110 1000 68 1100 0001 C1 +)0110 0110 66 10010 0111 127 4.2.2 算术运算指令 • 例:进行BCD码加法运算59+68=127 • MOV AL,59H • MOV BL,68H • ADD AL,BL • DAA • 减法十进制调整指令DAS(Decimal Adjust for Subtraction ) • 功能:用于对两个压缩型BCD码相减之后的结果(和必须放在AL中)进行调整,从而得到正确的压缩型BCD码。 • 调整方法:减法十进制调整方法与加法十进制调整方法类同,只是将加变为减。 加法运算结果为C1, AF=1,高4位大于9 加66H进行压缩BCD调整,AF=1,CF=1

  14. 4.2.2 算术运算指令 • (2)非压缩BCD码十进制调整指令 • 加法十进制调整 AAA(Ascii Adjust for Addition ) • 功能:对两个非压缩BCD码相加之后的和(和必须放在AL中)进行调整 • 调整方法: • 若(AL)低4位>9或AF=1,则(AL)+06H→(AL),(AH)+1,并使AF=1; • 屏蔽掉(AL)高4位,即(AL)←(AL)∧0FH; • CF←AF • 注意: • 隐含的操作寄存器为AL • 紧接在加法指令之后使用 • 只影响AF和CF两个状态标志位

  15. 4.2.2 算术运算指令 • 例: 9+4=? • MOV AL,09H • MOV BL,04H • ADD AL,BL • AAA • 减法十进制调整 AAS(Ascii Adjust for Subtraction ) • 功能:对两个非压缩BCD码相减之后的结果(必须放在AL中)进行调整 • 调整方法:减法十进制调整方法与加法十进制调整方法类同,只是将加变为减。 0000 1001 +)0000 0100 0000 1101;低4位>9,加06H调整 +)0000 0110 0001 0011 ;(AH)←(AH)+1,AF=1 ;(AL)←(AL)∧0FH,CF←AF

  16. 4.2.2 算术运算指令 • 乘法十进制调整 AAM(Ascii Adjust for Multiplication) • 功能:对AL中非压缩BCD乘法结果调整,调整结果存于AX中。 • 调整方法: • (AL)/0AH, (AH)←商,(AL)←余数 • 此操作就是对AL取模10的运算 • 注意: • 隐含的操作寄存器为AL和AH • AAM跟在MUL指令之后使用 • 只影响PF、ZF和SF三个状态标志位 • 例:AH=06H,AL=07H • MUL AH ;相乘结果=002AH→(AX) • AAM ;(AL)/0AH 商=04H→(AH),余数=02H→(AL)

  17. 4.2.2 算术运算指令 • 除法十进制调整 AAD(Ascii Adjust for Division) • 功能:两个非压缩BCD数相除前,对被除数进行十进制除法调整。 • 调整方法: • (AL)←(AH)×0AH+(AL),AH←0 • 注意: • 隐含的操作寄存器为AL和AH • AAD要在DIV指令之前使用 • 只影响PF、ZF和SF三个状态标志位 • 例:被除数AX=00000110 00000010=62BCD除数BL=00001000=08BCD • MOV AX,0602H • AAD ;00000110×1010+00000010=00111110→(AL),0→(AH) • DIV BL ;AX/BL=00000000 00111110÷00001000 ;商07BCD→(AL),余数06BCD→(AH)

  18. 4.2.3 逻辑运算和移位指令 • 逻辑运算指令可以对8位或16位的寄存器、存储器内容进行按位操作。 • 分三类:一般逻辑运算、移位和循环指令。

  19. 4.2.3 逻辑运算和移位指令 • 1.逻辑运算指令 • (1)逻辑“与”指令AND(and) • 格式:AND DST, SRC ;(DST)(DST)∧(SRC) • 功能:完成原操作数和目的操作数按位“与”操作 • 注意: • 源操作数可以是寄存器、存储器和立即数 • 目的操作数只能是寄存器和存储器操作数 • 影响PF、SF和ZF,对AF未定义,CF、OF清0 • 用途:对目的操作数的某些位清0,即屏蔽某些位 • 如:AND AL, 0FH ;屏蔽AL高4位,0FH是屏蔽字 AND AX, AX ;AX不变,将CF和OF清0

  20. 4.2.3 逻辑运算和移位指令 • (2)逻辑“或”指令OR(or) • 格式:OR DST, SRC ;(DST)(DST)∨(SRC) • 功能:完成原操作数和目的操作数按位“或”操作 • 注意: • 源操作数可以是寄存器、存储器和立即数 • 目的操作数只能是寄存器和存储器操作数 • 影响PF、SF和ZF,对AF未定义,CF、OF清0 • 用途:保持源操作数的某些位不变,而将其他的位置“1” • 如:OR AL, 20H ;置D5=1 OR AX, 00FFH ;令AL=FFH

  21. 4.2.3 逻辑运算和移位指令 • (3)逻辑“非”指令 NOT(not) • 格式:NOT OPR ;(OPR)(OPR) • 功能:对操作数按位求反 • 注意: • 操作数可以是寄存器、存储器,不能是立即数 • 对标志位无影响 • 如:NOT AX ;将AL内容按位取反→AL • (4)逻辑“异或”指令 XOR(exclusive or) • 格式:XOR DST, SRC ;(DST)(DST)(SRC) • 功能:完成原操作数和目的操作数按位“或”操作 • 用途:检测对应位是1还是0。常用操作数自身异或,使操作数清0。

  22. 4.2.3 逻辑运算和移位指令 • (5)测试指令 TEST(test) • 格式:TEST DST, SRC ;(DST)∧(SRC) • 功能:完成原操作数和目的操作数按位“与”操作,结果反映在标志位上,但并不送回。 • 注意: • 测试结果不改变原操作数的值 • 对标志寄存器的影响同AND • 用途:测试8位或16位操作数中的任何一位 如:TEST AL, 01H ;AL∧01H,若D0=0,则ZF=1 JZ THERE ;ZF=1则转移 …… THERE: ……

  23. 4.2.3 逻辑运算和移位指令 例:从4000H开始的单元中存放32个有符号数,要求统计负数的个数,并将结果存入BUFFER单元。 分析:用SI指向表的首地址,CX作计数器,DX作负数个数计数器。然后用TEST命令对每一个存储单元的符号位进行测试,D7=1则该数为负数。 主程序:XOR DX, DX ;MOV DX, 0 MOV SI, 4000H MOV CX, 32 AGAIN: MOV AL, [SI] ;AL←操作数,操作数地址(DS)×10H+(SI) INC SI TEST AL, 80H ;测试符号位D7 JZ NEXT ;为0转移到NEXT,否则顺序执行 INC DX NEXT: LOOP AGAIN ; CX←CX-1,CX不为0转移到AGAIN MOV BUFFER, DX

  24. CF 0 0 CF CF 4.2.3 逻辑运算和移位指令 • 2.非循环移位指令 • 算术左移 SAL OPRD,CNT • 算术右移 SAR OPRD,CNT • 逻辑左移 SHL OPRD,CNT • 逻辑右移 SHR OPRD,CNT • 其中:OPRD可为寄存器或存储器操作数,CNT可以为1或CL(CL先赋值移位次数),表示移位次数。 • 说明: • 右移/左移相当于减半/增倍。显然,逻辑右移/左移对无符号数减半/增倍;算术右移/左移对有符号数减半/增倍。 • 移位后若符号位改变,则OF=1,若不改变,则OF=0。 • 影响CF、OF、PF、SF和ZF,对AF未定义。

  25. 4.2.3 逻辑运算和移位指令 例:已知AL=X,求X*10 MOV AH, 0 ;AL扩展为字,无符号数 SAL AX, 1 ;2X MOV BX, AX ;移至BX中暂存 SAL AX, 1 ;4X SAL AX, 1 ;8X ADD AX, BX ;8X+2X 例:将AL中的压缩BCD码转换为ASCII码 MOV AH, AL ;压缩BCD码AL AND AL, 0FH ;析取低4位 OR AL, 30H ;低位ASCII码在AL中 MOV CL, 4 ; SHR AH, CL ; OR AH, 30H ;高位ASCII码在AH中

  26. CF CF CF CF 4.2.3 逻辑运算和移位指令 • 3.循环移位指令 • 循环左移 ROL OPRD,CNT • 循环右移 ROR OPRD,CNT • 带进位循环左移 RCL OPRD,CNT • 带进位循环右移 RCR OPRD,CNT • 其中:OPRD可为寄存器或存储器操作数,CNT可以为1或CL(CL先赋值移位次数),表示移位次数。 • 说明: • 只影响CF和OF

More Related