加法指令
说明:
1、DST:REG/MEM,SRC:8/16data/REG/MEM。
2、DST、SRC不能同时为MEM。
3、加法指令影响标志寄存器的状态标志。
4、INC指令不影响CF标志。
ADD(add) 加法
格式:ADD DST,SRC
操作:DST <= DST+SRC
ADC(add with carry) 带进位的加法
格式:ADC DST,SRC
操作:DST <= DST+SRC+CF
INC(increment) 加1
格式:INC DST
操作:DST <= DST +1
减法指令
说明:
1、DST:REG/MEM,SRC:8/16data/REG/MEM。
2、DST、SRC不能同时为MEM。
3、减法指令影响标志寄存器的状态标志。
4、DEC指令不影响CF标志。
SUB(subtract) 减法
格式:SUB DST,SRC
操作:DST <= DST-SRC
SBB(subtract with borrow) 带借位的减法
格式:SBB DST,SRC
操作:DST <= DST-SRC-CF
DEC(Decrement) 减1
格式:DEC DST
操作: DST <= DST -1
NEG(Negate)求补
格式:NEG DST
操作: DST <= 0-DST
利用NEG指令可以得到负数的绝对值
CMP(Compare) 比较
格式:CMP DST,SRC
操作:DST-SRC
相当于减法,但不保存结果,仅影响标志。
加减法例题
eg:计算两个多字节十六进制数之和:3B74AC60F8H+20D59E36C1H=?
式中被加数和加数均有5个字节,可以编一个循环程序实现以上运算。
假设已将被加数和加数分别存入从DATA1和DATA2开始的两个内存区,
且均为低位字节在前,高位字节在后。
要求相加所得结果仍存回以DATA1为首址的内存区。
MOV CX,5 ;设置循环次数
MOV SI,0 ;置位移量初值
CLC ;清进位CF
LOOPER:MOV AL,DATA2[SI] ;取一个加数
ADC DATA1[SI],AL ;和一个被加数相加
INC SI ;位移量加1
DEC CX ;循环次数减1
JNZ LOOPER ;加完否,若没完,转LOOPER
;继续相加
HLT ;程序暂停
乘法指令
说明:
1、SRC 为 REG/MEM。
2、乘法指令影响状态标志,但只对CF和OF有定义且CF=OF,其余的状态位不确定。
MUL(Unsigned Multiple) 无符号数乘法
格式:MUL SRC
操作:AX<=AL*SRC(字节)/ DX,AX<=AX*SRC(字)
默认使用AX 或 DX,AX 为目的操作数。
IMUL(Signed Multiple) 有符号数乘法
格式:IMUL SRC
操作:AX<=AL*SRC(字节)/ DX,AX<=AX*SRC(字)
默认使用AX 或 DX,AX为目的操作数。
除法指令
说明:
1、SRC 为 REG/MEM。
2、除法指令影响状态标志但对所有标志无定义。
3、商可能出现溢出,会立即产生除法溢出中断。
DIV(Unsigned divide)无符号数除法
格式:DIV SRC
操作:
1、字节除法:AX/SRC, 商=>AL, 余数=>AH
2、字除法:DX,AX/SRC, 商=>AX, 余数=>DX
IDIV(Signed divide)有符号数除法
格式:IDIV SRC
操作:
1、字节除法:AX/SRC, 商=>AL, 余数=>AH
2、字除法:DX,AX/SRC, 商=>AX, 余数=>DX
符号扩展指令
说明:
1、CBW和CWD对标志位无影响
2、扩展方法
由符号扩展指令实现,正数补0,负数补1。
(无符号数的扩展:将高位补0)
CBW(Convert byte to word)字节扩展到字
格式:CBW ;如果(AL)<80H,则(AH)<=00H,否则(AH)<=0FFH
操作:把AL扩展到AX。
CWD(Convert word to double word)字扩展到双字
格式:CWD ;如果(AX)<8000H,则(DX)<=0000H,否则(DX)<=0FFFFH
操作:把AX扩展到DX,AX 。