26
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 算术运算指令

  • Upload
    ardice

  • View
    82

  • Download
    0

Embed Size (px)

DESCRIPTION

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 算术运算指令. - PowerPoint PPT Presentation

Citation preview

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