算术运算指令

无符号: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位数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值