16位汇编第六讲----8086指令集(2)

来源:互联网 发布:韩国81端口活跃ip段 编辑:程序博客网 时间:2024/05/17 02:52

0x00 算术运算类指令

掌握:ADD/ADC/INC、SUB/SBB/DEC/ NEG/CMP
熟悉:MUL/IMUL、DIV/IDIV
理解:CBW/CWD、DAA/DAS、 AAA/ AAS/AAM/AAD

  • 加法指令ADD
ADD reg,imm/reg/mem    ;reg←reg+imm/reg/memADD mem,imm/reg    ;mem←mem+imm/reg
  • 带进位加法指令ADC

ADC指令将源与目的操作数相加,再加上进位CF标志,
结果送到目的操作数 ADC指令按状态标志的定义相应设置
ADC指令主要与ADD配合,实现多精度加法运算

ADC reg,imm/reg/mem    ;reg←reg+imm/reg/mem+CFADC mem,imm/reg    ;mem←mem+imm/reg+CF

作用:

mov ax,4652h    ;ax=4652hadd ax,0f0f0h   ;ax=3742h,CF=1mov dx,0234h    ;dx=0234hadc dx,0f0f0h   ;dx=f325h,CF=0;DX.AX0234 4652H    +F0F0 F0F0H    =F325 3742H
  • 增量指令INC(increment)
    作用:
    INC指令对操作数加1(增量)INC指令不影响进位CF标志,按定义设置其他状态标志
INC reg/mem;reg/mem←reg/mem+1

例子:

inc bxinc byte ptr [bx]
  • 减法指令SUB(subtract)
    作用:
    SUB指令将目的操作数减去源操作数,结果送到目的操作数
    SUB指令按照定义相应设置状态标志
SUB reg,imm/reg/mem    ;reg←reg-imm/reg/memSUB mem,imm/reg    ;mem←mem-imm/reg

例子:

mov al,0fbh ;al=0fbhsub al,07h  ;al=0f4h,CF=0
  • 带借位减法指令SBB
    作用:
    SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。
    SBB指令按照定义相应设置状态标志
    SBB指令主要与SUB配合,实现多精度减法运算
SBB reg,imm/reg/mem    ;reg←(reg-(imm/reg/mem)-CF)SBB mem,imm/reg    ;mem←mem-imm/reg-CF

例子:

mov ax,4652h    ;ax=4652hsub ax,0f0f0h   ;ax=5562h,CF=1mov dx,0234h    ;dx=0234hsbb dx,0f0f0h   ;dx=1143h,CF=1;DX.AX0234 4652H    -F0F0 F0F0H    =1143 5562H
  • 减量指令DEC(decrement)
    作用:
    DEC指令对操作数减1(减量)
    DEC指令不影响进位CF标志,按定义设置其他状态标志
DEC reg/mem;reg/mem←reg/mem-1

INC指令和DEC指令都是单操作数指令主要用于对计数器和地址指针的调整

  • 求补指令NEG(negative)

作用:
NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数
求补运算也可以表达成:将操作数按位取反后加1
NEG指令对标志的影响与用零作减法的SUB指令一样

NEG reg/mem;reg/mem←0-reg/mem

Neg的妙用
判断if(ax == 0) ax==0 else ax==1

neg axmov ax,0adc ax,0

以上语句就可以作为一个简单的三目运算

  • 比较指令CMP(compare)
    CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志
    CMP指令执行的功能与SUB指令,但结果不回送目的操作数
CMP reg,imm/reg/mem    ;reg-imm/reg/memCMP mem,imm/reg    ;mem-imm/reg

例子:

cmp al,100  ;al-100    jz below    ;al==100,跳转到below执行    sub al,100    ;al!=100,   al←al-100    inc ah  ;ah←ah+1below:  ...
  • 乘法指令
    不带符号位的乘法
MUL r8/m8;无符号字节乘法;AX←AL×r8/m8MUL r16/m16;无符号字乘法;DX.AX←AX×r16/m16

带符号位的乘法

IMUL r8/m8;有符号字节乘法;AX←AL×r8/m8IMUL r16/m16;有符号字乘法;DX.AX←AX×r16/m16

乘法指令如下影响OF和CF标志:

MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1
IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1

  • 除法指令

不带符号位的乘法

DIV r8/m8   ;无符号字节除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数DIV r16/m16 ;无符号字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数

带符号位的乘法

DIV r8/m8   ;有符号字节除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数IDIV r16/m16;有符号字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数

除法的功能:

1.除法指令分无符号和有符号除法指令

2.除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数
字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH
字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX
3.除法指令对标志没有定义
4.除法指令会产生结果溢出

除法错中断

1.被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断——除法错中断
2.对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出
3.对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,或者在字除时商不在-32768~32767范围内,则发生除法溢出

0 0
原创粉丝点击