ADD 加法 SUB 减法
ADC 带进位加 DEC 减1
INC 加1 NEG 求补
CMP 比较
⑶ 乘法指令 ⑷ 除法指令
MUL 无符号数乘法 DIV 无符号数除法
IMUL 带符号数乘法 IDIV 带符号数除法
⑸ 符号扩展指令 ⑹ 十进制调整指令
CBW 字节转换为字 DAA 加法的十进制调整
CWD 字转换为双字 DAS 减法的十进制调整
AAA 加法的ASCII调整
AAS 减法的ASCII调整
AAM 乘法的ASCII调整
AAD 除法的ASCII调整
ADD dst,src 加法指令(addition)
执行操作: (dst) ← (src)+(dst)
ADC dst,src 带进位加指令(add with carry)
执行操作: (dst) ← (src)+(dst)+CF
INC opr 加1指令(increment)
执行操作: (opr) ← (opr)+1
ADD和ADC指令是双操作数指令,它们的两个操作数不能同时为存储器寻址方式,也就是说,除源操作数为立即数的情况外,源和目的操作数必须有一个是寄存器寻址方式。INC指令是单操作数指令,它可以使用除立即数方式外的任何寻址方式。
ADD和ADC指令影响条件标志位(也称条件码),INC指令影响除CF外的其它条件码。条件码中最主要的是SF、ZF、CF和OF,加法运算对这四个条件码的设置方法如下:
SF=1 加法结果为负数(符号位为1)
SF=0 加法结果为正数(符号位为0)
ZF=1 加法结果为零
ZF=0 加法结果不为零
CF=1 最高有效位向高位有进位
CF=0 最高有效位向高位无进位
OF=1 两个同符号数相加(正数+正数,或负数加负数),结果符号与其相反
OF=0 不同符号数相加时,或同符号数相加,结果符号与其相同
计算机在执行运算时,并不区别操作数是带符号数还是无符号数,一律按上述规则设置条件码,因此,程序员要清楚当时处理的是什么类型的数据。例如,当加法运算结果的最高有效位为1时,机器将SF置1。如果参加运算的是两个带符号数,那么和的最高有效位是符号位,SF置1说明结果是一个负数。如果参加运算的是两个无符号数,那么和的最高有效位也是数值位,此时SF置0或置1都失去了表示正负数的意义。
对带符号数和无符号数,它们表示结果溢出的条件标志位也是不同的。上述OF位的设置条件显然只符合带符号数的溢出情况,OF=1表示运算结果是错误的。而无符号数溢出(运算结果超出了有限位的表示范围)时,表现为最高有效位产生进位,因此,CF=1是无符号数溢出的标志。另外,在双字长数运算时,低位字相加设置的CF,说明低位字向高位字有无进位的情况。
例 MOV BX,9B8CH ; (BX)=9B8CH
ADD BX,6478H ; now (BX)=0000H
9B8A 1001 1011 1000 1010
+ 6476 + 0110 0100 0111 0110
----------- --------------------------
1← 0000 1← 0000 0000 0000 0000
条件码设置: SF=0 最高有效位(D15)为0
ZF=1 结果为0
CF=1 最高有效位向高位有进位
OF=0 不同符号数相加,不产生溢出
例 编写执行双精度数(DX,CX)和(BX,AX)相加的指令序列,DX是目的操作数的高位字,BX是源操作数的高位字。指令执行前:
(DX,CX)= A248 2AC0H,(BX,AX)= 088A E25BH。
指令序列: ADD CX, AX ;(CX)= 0D1BH
ADC DX, BX ; now,(DX)=0AAD3H
执行ADD指令:
2AC0 0010 1010 1100 0000
+ E25B + 1110 0010 0101 1011
--------- ------------------------
1← 0D1B 1← 0000 1101 0001 1011
条件码设置: SF=0 最高有效位(D15)为0,无符号位意义
F=0 结果不为0
CF=1 最高有效位向高位有进位
OF=0 加数最高位分别为0、1,溢出位置0,OF对低位字无溢出意义
执行ADC指令:
A248 1010 0010 0100 1000
088A 0000 1000 1000 1011
+ 1 + 1←CF
---------- ----------------------------
AAD3 1010 1010 1101 0011
条件码设置: SF=1 最高有效位(D31)为1,对带符号数运算表示结果为负
ZF=0 结果不为0
CF=0 最高有效位向高位无进位
OF=0 结果符号与操作数相同,未产生溢出
2 减法指令
SUB dst,src 减法指令(subtract)
执行操作: (dst) ← (dst)-(src)
SBB dst,src 带借位减法指令(subtract with borrow)
执行操作: (dst) ← (dst)-(src)-CF
DEC opr 减1指令(decrement)
执行操作: (opr) ← (opr)-1
CMP opr1,opr2 比较指令(compare)
执行操作: (opr1)-(opr2),根据相减结果设置条件码,但不回送结果
以上指令除DEC指令不影响CF外,其他都影响条件码。与加法类似,SF和ZF分别表示减法结果的符号以及为零的情况;CF表明无符号数相减结果溢出与否;OF表明带符号数相减结果溢出与否。但在对CF和OF位的设置方法上减法和加法有所不同,下面对此做进一步说明:
CF=1 二进制减法运算中最高有效位向高位有借位(被减数<减数,不够减的情况)
CF=0 二进制减法运算中最高有效位向高位无借位(被减数≥减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同
NEG opr 求补指令(negate)
执行操作: (opr) ← -(opr),
求补操作即把操作数变为与其符号相反的数:。
机器在执行求补指令时,把操作数各位求反后末位加1,因此执行的操作也可表示为:
(opr) ← 0FFFFH-(opr)+1
NEG指令的条件码设置方法为:
CF=1 不为0的操作数求补时
CF=0 为0的操作数求补时
OF=1 当求补运算的操作数为-128(字节)或-32768(字)时
OF=0 当求补运算的操作数不为-128(字节)或-32768(字)时
① 43H-16H=2DH
0100 0011 0100 0011 条件码设置:CF=0
- 0001 0110 + 1110 1010 OF=0
-------------- --------------
0010 1101 1← 0010 1101
说明:机器作减法运算时,先将减数求补,然后转化为加法运算,所以实际上机器设置CF的方法是:最高有效位不产生进位时,CF=1;最高有效位产生进位时,CF=0。这和做减法时有借位CF=1,无借位CF=0是一致的。
本例参加运算的数无论是看作带符号数还是无符号数,运算结果均有效。
② 0C8H-66H=62H
1100 1000 1100 1000 条件码设置:CF=0
- 0110 0110 + 1001 1010 OF=1
-------------- ------------
0110 0010 1← 0110 0010
说明:如果是无符号数的运算,被减数够减无借位,所以CF置0,表明结果有效。如果操作数是带符号数,且被减数与减数符号相反,而结果符号与减数符号相同,所以OF置1,表明结果无效。
③ 54H-76H=0DEH
0101 0100 0101 0100 条件码设置:CF=1
- 0111 0110 + 1000 1010 OF=0
------------- -------------
1101 1110 1101 1110
说明:如果是无符号数的运算,本例中被减数<减数,减运算向高位有借位(或加运算无进位),则CF置0,表明结果无效。如果是带符号数的运算,同符号数相减,OF置0,结果有效。
④ 4BH-0B6H=0DEH
0100 1011 0100 1011 条件码设置:CF=1
- 1011 0110 + 0100 1010 F=1
--------------- -----------
1001 0101 1001 0101
说明:如果是无符号数的运算,本例中被减数<减数,减运算向高位有借位(或加运算无进位),则CF置0,表明结果无效。如果是带符号数的运算,不同符号数相减,且结果符号与减数符号相同,OF置1,结果也是无效的。
例 分析下列程序的执行情况:
DATA_A DD 62562FAH
DATA_B DD 412963BH
RESULT DD ?
… … …
MOV AX, WORD PTR DATA_A ; (AX)=62FAH
SUB AX, WORD PTR DATA_B ; sub 963BH from AX
MOV WORD PTR RESULT, AX ; save the result
MOV AX, WORD PTR DATA_A+2 ; (AX)=0625H
SBB AX, WORD PTR DATA_B+2 ; sub 0412H with borrow
MOV WORD PTR RESULT, AX ; save the result
答:SUB指令执行后,(AX)= 62FAH-963BH=0CCBFH,CF=1(有借位)。执行SBB指令后,(AX)= 625H-412H-1=212H,CF=0,OF=0,因此,保存于RESULT的结果数据为0212CCBFH。
MUL src 无符号数乘法(unsigned multiple)
IMUL src 带符号数乘法(signed multiple)
字节操作: (AX) ← (AL)×(src)
字操作: (DX, AX) ← (AX)×(src)
MUL和IMUL指令的区别仅在于操作数是无符号数还是带符号数,它们的共同点是,指令中只给出源操作数src,它可以使用除立即数方式以外的任一种寻址方式。目的操作数是隐含的,它只能是累加器(字运算为AX,字节运算为AL)。隐含的乘积寄存器是AX或DX(高位)和AX(低位)。
乘法指令只影响CF和OF,其它条件码位无定义。无定义是指指令执行后,条件码位的状态不确定,因此它们是无用的。
MUL指令的条件码设置为:
CF OF= 0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))
CF OF= 1 1 乘积的高一半不为0
这样的条件码设置可以指出字节相乘的结果是8位(CF=0)还是16位(CF=1),字相乘的结果是16位(CF=0)还是32位(CF=1)。
IMUL指令的条件码设置为:
CF OF= 0 0 乘积的高一半为低一半的符号扩展
CF OF= 1 1 其他情况
符号扩展是指做字节乘法时,乘积低8位的最高位为0,高8位也扩展为0,或者低8位的最高位为1,高8位也扩展为1的情况。对两个字相乘,符号扩展是指乘积的低16位的最高位为0,高16位也扩展为0,或者低16位的最高位为1,高16位也扩展为1的情况。
例 无符号数乘法
; from the data segment
DATA1 DB 25H
DATA2 DB 65H
RESULT DW ?
; from the code segment
MOV AL,DATA1
MOV BL,DATA2
MUL BL ; register addressing mode
MOV RESULT,AX
or
MOV AL,DATA1
MUL DATA2 ; direct addressing mode
MOV RESULT,AX
or
MOV AL,DATA1
MOV SI,OFFSET DATA2
MUL BYTE PTR [SI] ;register indirect addressing mode
MOV RESULT,AX
本例25H×65H=0E99H,高16位不为0,所以CF=1,OF=1。
例
DATA3 DW 2378H
DATA4 DW 2F79H
RESULT1 DW 2 DUP(?)
… …
MOV AX, DATA3 ; load first operand into AX
IMUL DATA4 ; multiply it by the second operand
MOV RESULT1, AX ; store the lower word result
MOV RESULT1+2, DX ; store the higher word result
本例2378H×2F79H=0693 CBB8H,即(DX)=0693H,(AX)=0CBB8H。因为高16位不是低16位的符号扩展,所以条件码设置为CF=1,OF=1。
上一篇:8086指令系统---串处理指令
下一篇:8086指令系统---算术指令(二)
推荐阅读最新更新时间:2024-03-16 14:32