Download ppt - 4.2.2 算术运算指令

Transcript
Page 1: 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 也提供了各种校正操作,故可以进行十进制算术运算。

Page 2: 4.2.2  算术运算指令

4.2.2 算术运算指令 1. 加法指令 不带进位的加法 ADD(add)ADD(add)

格式: ADD OPRD1 , OPRD2 功能: (OPRD1)(OPRD1)+(OPRD2)

带进位的加法 ADC(add with carry)ADC(add with carry) 格式: ADC OPRD1 , OPRD2 功能: (OPRD1)(OPRD1)+(OPRD2)+CF

加 1 指令 INC(increment)INC(increment) 格式: INC OPRD 功能: (OPRD)(OPRD)+1 (不影响 CF )

说明: 源操作数:立即数、通用 REG 、 M 三种寻址方式;目的操作数:通用 RE

G 、 M 两种寻址方式,立即数不能做目的操作数。 源操作数,目的操作数不能同为存储器寻址方式,类型要一致,段寄存器不

能做操作数。 这三条指令运算结果将影响状态标志位,但是 INC 指令不影响标志 CF 。

Page 3: 4.2.2  算术运算指令

4.2.2 算术运算指令 例如: ADD   AL , 50H ; AL 和 50H 相加,结果放在 AL 中 ADD   DI , SI ; DI 和 SI 的内容相加,结果放在 DI 中  ADD [ BX+DI ], AX ; BX+DI 和 BX+DI+1 两个存储单元的内容和 AX 中的内容

;相加,结果放在 BX+DI 和 BX+DI+1 所指的存储单元中

例如:  ADC   AX , SI ; AX 和 SI 中的内容以及 CF 的值相加,结果放在 AX 中 ADC   DX ,[ SI ] ; SI 和 SI+1 所指的存储单元的内容和 DX 的内容以及 CF

;的值相加,结果放在 DX 中

例如:  INC   AL ; 将 AL 中的内容加 1 INC   CX ; 将 CX 中的内容加 1    INC   BYTE PTR [ BX+DI+500 ] ; 将 BX+DI+500 所指的存储单元的内容加 1

Page 4: 4.2.2  算术运算指令

4.2.2 算术运算指令 2. 减法指令 不带借位减法 SUB(subtract)SUB(subtract)

格式: SUB OPRD1 , OPRD2 功能: (OPRD1)(OPRD1)-(OPRD2)

带借位减法 SBB(subtract with borrow)SBB(subtract with borrow) 格式: SBB OPRD1 , OPRD2 功能: (OPRD1)(OPRD1)-(OPRD2)-CF

减 1 指令 DEC(decrement)DEC(decrement) 格式: DEC OPRD 功能: (OPRD)(OPRD)-1

求补指令 NEG(negate)NEG(negate) 格式: NEG OPRD 功能: (OPRD)0-(OPRD)

比较指令 CMP(compare)CMP(compare) 格式: CMP OPRD1 , OPRD2 功能: (OPRD1)-(OPRD2) (只影响标志位,不回送结果,所影响的标志位

见课本 65 页)

Page 5: 4.2.2  算术运算指令

4.2.2 算术运算指令 例如: SUB   BX , CX ;将 BX 中的内容减去 CX 中的内容,结果放在 BX 中 SUB   [BP+2] , CL ;将 SS 段的 BP+2 所指的单元中的值减去 CL 中的值,结 ;果放在 BP+2 所指的堆栈单元中 SUB   AL , 20 ; AL 中的数减去 20 ,结果放在 AL 中 SUB   WORD PTR [DI] , 1000H ; DI 和 DI+1 所指的两单元中的数减去

; 1000H ,结果放在 DI 和 DI+1 所指的;单元中

例如: SBB   AX , 2030H ;将 AX 的内容减去立即数 2030H ,并减去进位位 CF 的

值       SBB   WORD PTR [DI+2] , 1000H ;将 DI+2 和 DI+3 所指的两单元的内容

;减去立即数 1000H ,并减去 CF 值,;结果放在 DI+2 和 DI+3 所指的单元中

Page 6: 4.2.2  算术运算指令

4.2.2 算术运算指令 例如: DEC   AX ;将 AX 的内容减 1 ,再送回 AX 中   DEC   BL ;将 BL 的内容减 1 ,结果送回 BL 中   DEC   BYTE PTR [ DI+2 ] ;将 DI+2 所指的单元的内容减 1 ,结果送

回此;单元

例如: NEG   AL ;将 AL 中的数取相反数,送回 AL    NEG   CX ;将 CX 中的数取相反数,送回 CX

例如:  CMP   AX , 2000H ;将 AX 的内容和 2000H 相比较,结果影响标志位 CMP   AL , 50H ; 将 AL 中的数和 50H 比较,结果影响标志位 CMP   DX , DI ;将 DX 和 DI 的内容相比 CMP   AX ,[ BX+DI+100 ] ;将累加器和两个存储单元的数相比,单元

地;址由 BX+DI+100 和 BX+DI+101 指出

Page 7: 4.2.2  算术运算指令

4.2.2 算术运算指令 3. 乘法指令 乘法运算是双操作数运算,但是,在指令中却只指定一个操作数,另一

个操作数是隐含规定的。 其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为 AL 或

AX 。 指令格式:

无符号数乘法 MUL OPRDMUL OPRD ;字节乘法: (AX)(AL)* OPRD

;字乘法: (DX,AX)(AX)* OPRD

带符号数乘法 IMUL OPRDIMUL OPRD ;操作同上 进行字节运算时,目的操作数必须是累加器 AL ,乘积在寄存器 AX 中。 进行字运算时,目的操作数必须是累加器 AX ,乘积在寄存器 DX , AX

中。

Page 8: 4.2.2  算术运算指令

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

Page 9: 4.2.2  算术运算指令

4.2.2 算术运算指令

4. 除法指令 指令格式:

无符号数除法 DIV OPRDDIV OPRD 带符号数除法 IDIV OPRDIDIV OPRD

在除法运算中,如果除数是 8 位的,则要求被除数是 16 位的;如果除数是 16 位的,则要求被除数是 32 位的。

Page 10: 4.2.2  算术运算指令

4.2.2 算术运算指令 注意:

当除数是字节数据时,被除数必须放在 AX 中;当除数是字数据时,被除数必须放在 DX , AX 中。

除法指令运算结果对状态标志无定义。 8086/8088 规定 IDIV 指令运算结果余数的符号与被除数相同。 当被除数位数不够时,需扩展到所需的位数,带符号数需进行符号位

扩展。 若商超出字或字节表示的范围,自动产生 0 号中断

符号扩展指令: 字节扩展到字 CBWCBW ;将寄存器 AL 中的符号位扩展到寄存器 AH 字扩展到双字 CWDCWD ;将寄存器 AX 中的符号位扩展到寄存器 DX

7 0AL7 0AH

015 AXDX15 0

CBW

CWD

Page 11: 4.2.2  算术运算指令

4.2.2 算术运算指令

5. 十进制(或 BCD 码)运算调整指令 BCD 码:用二进制编码的十进制数,又称二 -- 十进制数 压缩的 BCD 码:用 4 位二进制数表示 1 位十进制数 例: (59)10 = (0101 1001)BCD

非压缩的 BCD 码:用 8 位二进制数表示 1 位十进制数 例: (59)10 = (0000 0101 0000 1001)BCD

问题的提出:问题的提出:19 压缩 BCD: 0001 1001

+ 08 + 0000 1000 27 0010 0001 + 110

(0010 0111)BCD AF=1

Page 12: 4.2.2  算术运算指令

4.2.2 算术运算指令

( 1 )压缩 BCD 码十进制调整指令 加法十进制调整指令 DAA(Decimal Adjust Addition)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 个标志位

Page 13: 4.2.2  算术运算指令

4.2.2 算术运算指令 例:进行例:进行 BCDBCD 码加法运算码加法运算 59+68=12759+68=127 MOV AL , 59H MOV BL , 68H ADD AL , BL DAA

减法十进制调整指令 DAS(Decimal Adjust for Subtraction )DAS(Decimal Adjust for Subtraction ) 功能:用于对两个压缩型 BCD 码相减之后的结果(和必须

放在 AL 中)进行调整,从而得到正确的压缩型 BCD 码。 调整方法:减法十进制调整方法与加法十进制调整方法类同,

只是将加变为减。

加法运算结果为 C1,AF=1 ,高 4位大于 9

加 66H 进行压缩 BCD调整, AF=1 , CF=1

0101 1001 59+ ) 0110 1000 68 1100 0001 C1+ ) 0110 0110 66 10010 0111 127

Page 14: 4.2.2  算术运算指令

4.2.2 算术运算指令 ( 2 )非压缩 BCD 码十进制调整指令 加法十进制调整 AAA(Ascii Adjust for Addition )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 两个状态标志位

Page 15: 4.2.2  算术运算指令

4.2.2 算术运算指令 例例 : 9+4=: 9+4= ?? MOV AL , 09H MOV BL , 04H ADD AL , BL AAA

减法十进制调整 AAS(Ascii Adjust for Subtraction )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

Page 16: 4.2.2  算术运算指令

4.2.2 算术运算指令 乘法十进制调整 AAM(Ascii Adjust for Multiplication)AAM(Ascii Adjust for Multiplication) 功能:对 AL 中非压缩 BCD 乘法结果调整,调整结果存于

AX 中。 调整方法:

(AL)/0AH, (AH)← 商, (AL)← 余数 此操作就是对 AL 取模 10 的运算

注意 : 隐含的操作寄存器为 AL 和 AH AAM 跟在 MUL 指令之后使用 只影响 PF 、 ZF 和 SF 三个状态标志位

例:例: AH=06HAH=06H ,, AL=07HAL=07H MUL AH ;相乘结果 =002AH→(AX) AAM ; (AL)/0AH 商 =04H→(AH) ,余数 =02H→(AL)

Page 17: 4.2.2  算术运算指令

4.2.2 算术运算指令 除法十进制调整 AAD(Ascii Adjust for Division)AAD(Ascii Adjust for Division) 功能:两个非压缩 BCD 数相除前,对被除数进行十进制除

法调整。 调整方法:

(AL)←(AH)×0AH + (AL) , AH←0 注意 :

隐含的操作寄存器为 AL 和 AH AAD 要在 DIV 指令之前使用 只影响 PF 、 ZF 和 SF 三个状态标志位

例:被除数例:被除数 AX=00000110 00000010=62AX=00000110 00000010=62BCDBCD 除数除数 BL=00001000=08BL=00001000=08BCDBCD MOV AX , 0602H AAD ; 00000110×1010 + 00000010=00111110→(AL) , 0→(AH) DIV BL ; AX/BL=00000000 00111110÷00001000

;商 07BCD→(AL) ,余数 06BCD→(AH)

Page 18: 4.2.2  算术运算指令

4.2.3 逻辑运算和移位指令

逻辑运算指令可以对 8 位或 16 位的寄存器、存储器内容进行按位操作。

分三类:一般逻辑运算、移位和循环指令。

Page 19: 4.2.2  算术运算指令

4.2.3 逻辑运算和移位指令

1. 逻辑运算指令 ( 1 )逻辑“与”指令 AND(and)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

Page 20: 4.2.2  算术运算指令

4.2.3 逻辑运算和移位指令

( 2 )逻辑“或”指令 OR(or)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

Page 21: 4.2.2  算术运算指令

4.2.3 逻辑运算和移位指令 ( 3 )逻辑“非”指令 NOT(not)NOT(not) 格式: NOT OPR ; (OPR)(OPR) 功能:对操作数按位求反 注意 :

操作数可以是寄存器、存储器,不能是立即数 对标志位无影响 如:如: NOT AX ; 将 AL 内容按位取反→ AL

( 4 )逻辑“异或”指令 XOR(exclusive or)XOR(exclusive or) 格式: XOR DST, SRC ; (DST)(DST)(SRC) 功能:完成原操作数和目的操作数按位“或”操作 用途:检测对应位是 1 还是 0 。常用操作数自身异或,使操

作数清 0 。

Page 22: 4.2.2  算术运算指令

4.2.3 逻辑运算和移位指令

( 5 )测试指令 TEST(test)TEST(test) 格式: TEST DST, SRC ; (DST)∧(SRC) 功能:完成原操作数和目的操作数按位“与”操作,结果反映在标志位上,但并不送回。

注意 : 测试结果不改变原操作数的值 对标志寄存器的影响同 AND

用途:测试 8 位或 16 位操作数中的任何一位

如:如: TEST AL, 01H ;AL∧01H ,若 D0=0 ,则 ZF=1 JZ THERE ;ZF=1 则转移 ……THERE: ……

Page 23: 4.2.2  算术运算指令

4.2.3 逻辑运算和移位指令

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

JZ NEXT ; 为 0 转移到 NEXT ,否则顺序执行 INC DXNEXT: LOOP AGAIN ; CX←CX- 1,CX 不为 0 转移到 AGAIN MOV BUFFER, DX

Page 24: 4.2.2  算术运算指令

4.2.3 逻辑运算和移位指令 2. 非循环移位指令

算术左移 SAL OPRDSAL OPRD ,, CNTCNT 算术右移 SAR OPRDSAR OPRD ,, CNTCNT 逻辑左移 SHL OPRDSHL OPRD ,, CNTCNT 逻辑右移 SHR OPRDSHR OPRD ,, CNTCNT

其中: OPRD 可为寄存器或存储器操作数, CNT 可以为 1或 CL ( CL 先赋值移位次数),表示移位次数。

说明 : 右移 / 左移相当于减半 / 增倍。显然,逻辑右移 / 左移对无符号数减半 / 增倍;算术右移 / 左移对有符号数减半 / 增倍。

移位后若符号位改变,则 OF=1 ,若不改变,则 OF=0 。 影响 CF 、 OF 、 PF 、 SF 和 ZF ,对 AF 未定义。

CF

CF 0

0 CF

Page 25: 4.2.2  算术运算指令

4.2.3 逻辑运算和移位指令

例:例:已知 AL=X ,求 X*10MOV AH, 0 ; AL 扩展为字,无符号数SAL AX, 1 ; 2XMOV BX, AX ;移至BX 中暂存SAL AX, 1 ; 4XSAL AX, 1 ; 8XADD AX, BX ; 8X+2X例:例:将 AL 中的压缩 BCD 码转换为 ASCII 码MOV AH, AL ;压缩 BCD 码 ALAND AL, 0FH ;析取低 4 位OR AL, 30H ;低位 ASCII 码在 AL 中MOV CL, 4 ;SHR AH, CL ;OR AH, 30H ;高位 ASCII 码在 AH 中

Page 26: 4.2.2  算术运算指令

4.2.3 逻辑运算和移位指令

3. 循环移位指令 循环左移 ROL OPRDROL OPRD ,, CNTCNT 循环右移 ROR OPRDROR OPRD ,, CNTCNT 带进位循环左移 RCL OPRDRCL OPRD ,, CNTCNT 带进位循环右移 RCR OPRDRCR OPRD ,, CNTCNT

其中: OPRD 可为寄存器或存储器操作数, CNT 可以为 1或 CL ( CL 先赋值移位次数),表示移位次数。

说明 : 只影响 CF 和 OF

CF

CF

CF

CF