260 likes | 392 Views
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 算术运算指令.
E N D
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 算术运算指令 • 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。
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.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页)
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所指的单元中
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指出
4.2.2 算术运算指令 • 3.乘法指令 • 乘法运算是双操作数运算,但是,在指令中却只指定一个操作数,另一个操作数是隐含规定的。 • 其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为AL或AX。 • 指令格式: • 无符号数乘法MUL OPRD;字节乘法:(AX)(AL)* OPRD ;字乘法:(DX,AX)(AX)* OPRD • 带符号数乘法IMUL OPRD;操作同上 • 进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中。 • 进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。
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
4.2.2 算术运算指令 • 4.除法指令 • 指令格式: • 无符号数除法 DIV OPRD • 带符号数除法 IDIV OPRD • 在除法运算中,如果除数是8位的,则要求被除数是16位的;如果除数是16位的,则要求被除数是32位的。
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
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 • 问题的提出:
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个标志位
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
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两个状态标志位
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
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)
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)
4.2.3 逻辑运算和移位指令 • 逻辑运算指令可以对8位或16位的寄存器、存储器内容进行按位操作。 • 分三类:一般逻辑运算、移位和循环指令。
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
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
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。
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: ……
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
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未定义。
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中
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