汇编(十)——算术运算类指令

术运算类指令用来执行二进制及十进制的算术运算:加减乘除。
这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果。

 

一、加法指令
1、加法指令ADD
ADD  reg,imm/reg/mem       ;reg←reg+imm/reg/mem
ADD  mem,imm/reg           ;mem←mem+imm/reg
ADD指令按照状态标志的定义相应的设置这些标志的0或1状态。
2、带进位标志加法指令ADC
ADC  reg,imm/reg/mem    ;reg←reg+imm/reg/mem+CF
ADC  mem,imm/reg        ;mem←mem+imm/reg+CF
ADC指令除完成ADD加法指令运算外,还要加进位CF。
3、增量指令INC
INC  reg/mem       ;reg/mem←reg/mem+1
INC指令对操作数加1(增量)。它是一个单操作数指令。
设计加1指令和后面介绍的减1指令的目的,主要是用于对计数器和地址指针的调整,所以他们不影响进位CF标志,对其他标志位的影响与ADD,ADC相同。
二、减法指令
1、减法指令SUB
SUB  reg,imm/reg/mem    ;reg←reg-imm/reg/mem
SUB  mem,imm/reg        ;mem←mem/reg
2、带借位减法指令SBB
SBB  reg,imm/reg/mem    ;reg←reg-imm/reg/mem-CF
SBB  mem,imm/reg        ;mem←mem-imm/reg-CF
3、减量指令DEC
DEC reg/mem             ;reg/mem←reg/mem-1
同样不影响CF标志。
4、求补指令NEG
NEG  reg/mem            ;reg/mem←0-reg/mem
NEG指令也是一个单操作数指令,它对操作数执行求补运算,即用零减去操作数,然后结果返回操作数。求补运算也可以表达成:将操作数按位求反后加1。
5、比较指令CMP
CMP  reg,imm/reg/mem    ;reg-imm/reg/mem
CMP  mem,imm/reg        ;mem-imm/reg
该指令将目的操作数减去源操作数,但结果不回送目的操作数。也就是说CMP指令与减法指令SUB执行相同的操作,同样影响标志,只是不改变目的操作数。CMP指令用于比较两个操作数的大小关系。执行比较指令之后,可以根据标志判断两个数是否相同、大小关系等。所以,CMP指令后常跟条件转移指令,根据比较结果不同产生不同的分支。
三、乘法指令
1、无符号数乘法指令MUL
MUL指令执行无符号二进制数的乘法运算:
MUL  r8/m8          ;无符号字节乘:AX←AL×r8/m8
MUL  6/6            ;无符号字乘:DX.AX←AX×r16/m16
乘法指令隐含使用一个操作数AX和DX,源操作数则显式给出,可以是寄存器或存储单元。MUL指令影响标志OF和CF。
2、有符号数乘法指令IMUL
IMUL r8/m8           ;有符号数字节乘:AX←AL×r8/m8
IMUL r16/m16         ;有符号数字乘:DX.AX←AX×r16/m16
四、除法指令
1、无符号数除法指令DIV
DIV r8/m8            ;无符号字节除法:AL←AX÷r8/m8的商,AH←AX÷r8/m8的余数
DIV r16/m16          ;无符号字除法:AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数。
2、有符号数除法指令IDIV
IDIV r8/m8
IDIV r16/m16
五、符号扩展指令
符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。符号扩展指令可用来将字节转换为字,字转换为双字。均不影响标志位。
1、字节转换为字指令CBW
CBW        ;AL符号扩展成AX
CBW指令将AL的最高有效位D7扩展至AH,即:如果AL的最高有效位是0,则AH=00;AL的最高有效位为1,则AH=FFH。AL不变。
2、字转换为双字指令CWD
CWD     ;AX符号扩展成DX
指令将AX的内容符号扩展形成DX,即如果AX的最高有效位D15位0,则DX=0000H,如果AX的最高有效位为1,则DX=FFFFh.
符号扩展指令常用来获得除法指令所需要的被除数。
六、十进制调整指令
十进制调整指令对二进制运算结果进行十进制调整,以得到十进制的运算结果。十进制在计算机中也要用二进制表示,这就是十进制编码的十进制数:BCD码。8086支持压缩的BCD码和非压缩的BCD码,相应的十进制调整指令分为压缩BCD码调整指令和非压缩BCD码调整指令。
1、压缩BCD码调整指令
压缩的BCD码是通常的8421码,它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即00~99。
(1)加法的十进制数调整指令DAA
DAA      ;AL←将AL中的加和调整为压缩BCD码
该指令跟在以AL为目的操作数的ADD或ADC指令之后,对AL的二进制结果进行十进制调整,并在AL得到十进制结果。DAA指令对OF标志无定义,按其结果影响所有其他标志,其中CF反映压缩BCD码相加的进位状态。
(2)减法的十进制调整指令DAS
DAS      ;AL←将AL中的减差调整为压缩BCD码
2、非压缩BCD码调整指令
非压缩BCD码用8个二进制位表示一个十进制位。
(1)加法的非压缩BCD码调整指令AAA
AAA          ;AL←将AL中的加和调整为非压缩BCD码,AH←AH+调整产生的进位
该指令跟在以AL为目的操作数的ADD或ADC指令之后,对AL进行非压缩BCD码调整;如果调整中产生了进位,则将进位1加到AH中,同时CF=AF=1;否则CF=AF=0。AAA指令对其他标志无定义。使AL的高4位清0。
(2)减法的非压缩BCD码调整指令AAS
AAS      ;AL←将AL中的减差调整为非压缩BCD码,AH←AH-调整产生的借位
该指令跟在以Al为目的操作数的SUB或SBB指令之后,对AL进行非压缩BCD码调整;如果调整中产生了借位,则将AH减去借位1,同时CF=AF=1;否则CF=AF=0.
(3)乘法的非压缩BCD码调整指令AAM
AAM   ;AX←将AX中的乘积调整为非压缩BCD码
该指令跟在以AX为目的操作数的MUL指令之后,对AX进行非压缩BCD码调整。利用MUL相乘的两个非压缩BCD码的高4位必须为0。AAM指令根据结果设置SF、ZF和PF,但OF、CF、AF无定义。
(4)除法的非压缩BCD码调整指令AAD
AAD      ;AX←将AX中的非压缩BCD码扩展成二进制数,即:AL←10d×AH+AL,AH←0
AAD调整指令与其他的调整指令应用情况不同。他先将存放在AX寄存器中的两位非压缩BCD码数进行调整,然后再用DIV指令除以一个非压缩BCD码数,这样得到非压缩BCD码数的除法结果。其中,要求AL、AH和除数的高4位为0。AAD指令根据结果设置SF、ZF和PF,但OF、CF和AF无定义。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值