无符号:0 ~ 65535
有符号:-32768 ~ +32767
组合BCD:一字节表示两个BCD码
非组合BCD:一字节只用低四位表示一个BCD码,高四位为0
加法指令
ADD
不带进位加法
ADC
带进位加法
INC
加1
DAA
BCD调整(压缩BCD 码)
AAA
BCD调整(非压缩BCD 码)
ADD
不带进位的加法
ADD dst, src ; dst = dst + src
改变OF,SF,ZF,AF,PF,CF标志位
ADD reg, im ;寄存器与立即数相加
ADD reg, reg ;寄存器之间
ADD reg, mem ;寄存器加存储器
ADD mem, im ;存储器加立即数
ADD mem, reg ;存储器加寄存器
dst和src可使用多种寻址方式,但dst不能是立即数
ADC
带进位加法
ADC dst, src ; dst = dst + src + cf
可见ADC不会单独出现,不然CF标志位哪来?
ADC可以用于双字的加法:ADD加低2字节,ADC加高2字节
计算2000_1000 + 4000_3000
MOV AX, 1000H ; 低字
ADD AX, 3000H ; 低字相加
MOV BX, 2000H ; 高字
ADC BX, 4000H ; 高字相加
结果就是BX AX = 6000_4000
INC
自增1
INC src ; src = src + 1
只影响OF、SF、ZF、PF,不影响CF标志
- src可以是寄存器或存储器操作数
- src不允许是立即数
AAA
BCD调整(非压缩BCD 码)
AAA
出现半进位或低4位有数>9,加6调整
调整在AL中进行,调整后的结果在AX中。
指令执行后,影响AF、CF,其余标志无定义
AAA调整过程:
如果 (AL&0FH)>9 或 (AF)=1
则 (AL)+6–>AL
(AH)+1–>AH
1–>AF, AF–>CF
(AL)&0FH–>AL
DAA
BCD调整(压缩BCD 码)
; 2964 + 4758
MOV AL, BCD1 ; AL = 64
ADD AL, BCD2 ; AL = 58 + 64
DAA ; 调整低位
MOV BCD3, AL ; 存入低位 22
MOV AL, BCD1+1 ; AL = 29 + CF
ADC AL, BCD2+1 ; AL = AL + 47 + CF
DAA ; 调整高位
MOV BCD3+1, AL ; 存入高位 77
; BCD123是地址操作数
不影响OF标志位,影响其他标志位
调整在AL中进行,结果放在AL中
一次只能调整两位10进制数(AL是1字节,压缩BCD码)
(1)出现半进位或低4位有数>9 ,低4位加6调整
(2)出现进位或高4位有数>9 ,高4位加6调整
DAA调整过程:
如果 (AL & 0FH)>9 或 (AF)=1
则(AL)+6–>AL
1–>AF
如果(AL & F0H)>9或 (CF)=1
则(AL)+60H–>AL
1–>CF
减法指令
SUB (减法指令)
SBB (带借位的减法指令)
DEC (减1指令)
NEG (求补指令)
CMP (比较指令)
DAS (组合十进制数减法调整指令)
AAS(非组合十进制数减法调整指令)
减法的FLAGS寄存器标志位和加法运算相同,只不过将进位变成借位
SUB
不考虑借位的减法指令SUB
SUB dst, src ; dst = dst - src
1.源和目的操作数不能同时为存储器操作数
2.立即数不能作为目的操作数
SBB
考虑借位的减法指令SBB
SBB dst, src ; dst = dst - src - cf
主要用于双字减法,依旧和ADD相同,不会单独出现,低字节用SUB,高字节用SBB
DEC
减1指令
DEC src ; src = src - 1
NEG
NEG src ; src = 0 - src
操作数按位求反后末位加1,其实就是用零减去操作数
NEG指令执行后,对OF、SF、ZF、AF、PF、CF均产生影响。总使CF=1
CMP
比较指令
CMP dst src ; dst - src 不复制,只是改变FLAGS里的标志位
CMP也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上。必须区分无符号数比较与有符号数比较
用标志位CF(ZF=0)判断无符号数的大小
CF=0,则 dst>src
CF=1,则 dst<src
用标志位SF和OF与ZF=0 判断有符号数的大小
SF、OF符号相同,则 dst>src
SF、OF符号不同,则 dst<src
AAS
将AL中的两个非压缩BCD码的差进行调整,正确结果送AX中
和加法调整指令原则一样,不过把+6改为-6
DAS
对AL中的压缩BCD码差进行调整, 紧跟在减法指令之后
和加法调整指令原则一样,不过把+6改为-6
乘法指令
- 进行乘法时:
8位 X 8位 → 16位
16位 X 16位 → 32位 - 乘法指令的两个操作数中,其中一个隐藏在AL或AX中。
- 字节相乘,被乘数放在AL中,结果在AX中
- 字相乘,被乘数放在AX中,结果在DX(高16 位),AX(低16位)
MUL
无符号数的乘法指令
MUL src ; AX = AL * src 或者 DX,AX = AX * src
IMUL
有符号数乘法指令
IMUL src ;
注意:MUL/IMUL指令中
● AL(AX)为隐含的被乘数寄存器;
● AX(DX,AX)为隐含的乘积寄存器;
● src不能为立即数;
● 除CF和OF外,对其它标志位无定义。
AAM
对8位非组合BCD码的乘积(AX的内容)进行调整,调整后的结果仍为一正确的非组合BCD码,放回AX中。紧跟在乘法指令之后,因BCD码总认为是无符号数,故采用MUL指令调整过程:
将AL除以10, 商送AH, 余数送AL
除法指令
DIV 无符号数除指令
IDIV 带符号数除指令
AAD BCD调整(非压缩BCD 码)
CBW 符号扩展指令-字节扩展成字
CWD 符号扩展指令-字扩展成双字
DIV
DIV src
注:若除数为零或AL中商大于FFH(或AX中商大于FFFFH),则CPU产生一个类型0的内部中断。
• src不能为立即数。
• 除法运算后,对所有条件标志位均无定义。
IDIV
商及余数均为有符号数,且余数符号总是与被除数符号相同。
IDIV src
• src不能为立即数。
• 除法运算后,对所有条件标志位均无定义。
当被除数只有8(16)位而除数也为8(16)位,必须将此8位被除数放入AL(AX)中,并用符号扩展法将符号扩展到AH(DX)中,变成16位长的数,否则会产生错误。
AAD
CBW
字节扩展成字
CBW
扩展AL中的符号位扩展至AH中,将8位数扩展成等效的16位数
CWD
CWD
扩展AX中的符号位至DX中,将16位数扩展成等效的32位数