汇编指令之算数指令
算术指令
注意:影响标志位,为条件码:主要 CF,ZF,SF,OF,
- 乘除,均不涉及立即数imm
[参考] 汇编]8086指令系统---算术指令(一)_极品小肥羊的博客-CSDN博客
加法指令
-
ADD DST,SRC
DST <- (DST+SRC)
eg: ADD reg,reg ADD reg,mem ADD reg,imm ADD mem,reg ADD mem,imm
-
ADC DST,SRC
DST <- (DST+SRC+CF)
同上 + CF;
-
INC DST
DST <- DST+1; DST:reg,mem
SF=1 加法结果为负数(符号位为1)
SF=0 加法结果为正数(符号位为0)
ZF=1 加法结果为零
ZF=0 加法结果不为零
CF=1 最高有效位向高位有进位
CF=0 最高有效位向高位无进位
OF=1 两个同符号数相加(正数+正数,或负数加负数),结果符号与其相反
OF=0 不同符号数相加时,或同符号数相加,结果符号与其相同
计算机在执行运算时,并不区别操作数是带符号数还是无符号数,一律按上述规则设置条件码,
ADC指令主要与ADD配合,实现多精度加法运算
减法指令
-
SUB DST,SRC
;DST <- (DST-SRC)
SUB reg,reg SUB reg,mem SUB reg,imm SUB mem,reg SUB mem,imm
-
SBB DST,SRC
;DST <- (DST-SRC-CF);
同上 - CF
-
DEC DST
;DST <- DST-1 DST: reg,mem
-
NEG DST; 求补
;DST <- (0-DST); DST:reg,mem
求补操作即把操作数变为与其符号相反的数:。 机器在执行求补指令时,把操作数各位求反后末位加1,因此执行的操作也可表示为: (DST) ← 模-(DST)+1
-
CMP DST,SRC;
;DST-SRC ;仅影响标志位
eg: CMP reg,reg CMP reg,mem CMP reg,imm COM mem,reg COM mem,imm
SF和ZF分别表示减法结果的符号以及为零的情况;
CF表明无符号数相减结果溢出与否;
OF表明带符号数相减结果溢出与否。
但在对CF和OF位的设置方法上减法和加法有所不同,下面对此做进一步说明:
CF=1 二进制减法运算中最高有效位向高位有借位(被减数<减数,不够减的情况)
CF=0 二进制减法运算中最高有效位向高位无借位(被减数≥减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同
乘法指令
[参考] 汇编]8086指令系统---算术指令(二)_极品小肥羊的博客-CSDN博客
无符号乘法
乘法指令只影响CF和OF,其它条件码位无意义
MUL指令的条件码设置为:
CF OF= 0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))
CF OF= 1 1 乘积的高一半不为0
-
MUL SRC
;AX <- (AL*SRC_8) ;DX,AX <- (AX*SRC_16) MUL reg8 MUL reg16 MUL mem8 MUL mem16
有符号乘法
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的情况。
-
IMUL SRC
;AX <- (AL*SRC_8) ;(DX,AX) <- (AX*SRC_16) IMUL reg8 IMUL reg16 IMUL mem8 IMUL mem16
除法指令
参加运算的除数和被除数是无符号数时,使用DIV指令,其商和余数也均为无符号数。
IDIV指令执行的操作与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,而且余数的符号与被除数的符号相同。
除法指令对Flags无定义,因此对除法指令产生的错误,如除数为0或商溢出等错误,由系统直接转入0型中断来处理。所谓商溢出,是指被除数高一半的绝对值大于除数的绝对值时,商超出了16位的表示范围(字操作)或8位的表示范围(字节操作)
- 除法指令要求字操作时,被除数必须为32位,除数是16位,商和余数是16位的;
字节操作时,被除数必须为16位,除数是8位,得到的商和余数是8位的。- 不足可以对AX DX用字符扩展指令
无符号除法
-
DIV SRC
;AL <- (AX / SRC_8) ;AH <- (AX % SRC_8) ;AX <- (AX / SRC_16) ;DX <- (AX % SRC_16) DIV reg8 DIV reg16 DIV mem8 DIV mem16
-
有符号除法
IDIV SRC
;AL <- (AX / SRC_8) ;AH <- (AX % SRC_8) ;AX <- (AX / SRC_16) ;DX <- (AX % SRC_16) 同上
-
字节转换成字(有符号数)
- 进行符号扩展的操作数必须存放在AL寄存器或AX寄存器中
CBW;
若AL最高位为0,则AH全为0; 若AL最高位为1,则AH全为FFH;类似于字符扩展 eg (AH)= 00H 当(AL)的最高有效位为0时 (AH)= FFH 当(AL)的最高有效位为1时 符号扩展是指 做字节乘法时,乘积低8位的最高位为0,高8位也扩展为0,或者低8位的最高位为1,高8位也扩展为1的情况。 对两个字相乘,符号扩展是指乘积的低16位的最高位为0,高16位也扩展为0,或者低16位的最高位为1,高16位也扩展为1的情况。
-
字转换成双字节(有符号)
CWD;
若AX最高位为0,则DX全为0; 若AX最高位为1,则DX全为FFH;类似于字符扩展 eg (DX)=0000H当(AX)的最高有效位为0时 (DX)=FFFFH当(AX)的最高有效位为1时 若(AX)= 0BA45H, CBW; 执行后,(AH)=00, (AL)=45H, 或 (AX)=0045H CWD; 执行后,(DX)=0FFFFH, (AX)=0BA45H
BCD 码调整
8086微型机提供了一组十进制调整指令,用来处理ASCII码和BCD码表示的数。
压缩BCD码调整指令
每个字节两个BCD码
10010101B=95H ;值就为95
-
DAA ;
对加法运算结果AL 进行BCD 码调整
-
DAS;
对减法运算结果AL进行BCD码调整
非压缩BCD码调整指令
-
低4位为BCD码,高4位为零
-
加减运算非压缩BCD码高4位的值可不为0,乘除时高4位必须是0
-
AAA;
对加法运算非压缩BCD码进行调整,进位送进AH中
-
AAS;
对减法运算非压缩BCD码进行调整,
-
AAM;
对乘法运算非压缩BCD码进行调整,
-
AAD;
对除法运算非压缩BCD码进行调整,