汇编语言-adc、sbb以及cmp指令

adc指令:

adc 是带进位加法指令,它利用了CF位上记录的进位值

指令格式: adc 操作对象1,操作对象2

功能: 操作对象1 = 操作对象1 + 操作对象2 + CF

例如指令 adc ax,bx 实现的功能是: (ax)=(ax)+(bx)+CF

例如:


mov ax,2
mov bx,1
sub bx,ax
adc ax,1

执行后,(ax)=4 。 adc执行时,相当于计算: (ax)+1+CF = 2+1+1 = 4

add ax, dx;    —> ax = ax+dx

adc ax, dx;    —-> ax = ax+dx+carry(进位)

sub ax, dx;  —-> ax = ax - dx

sbb ax, dx; ——> ax = ax - dx - carry


sbb指令:

sbb是带借位减法指令,它利用了CF位上记录的借位值。

指令格式:sbb 操作对象1,操作对象2

功能:操作对象1 = 操作对象1 - 操作对象2 - CF

SBB与SUB的区别

SUB AX,BX 的结果是 AX-BX

SBB AX,BX 的结果是 AX-BX-CF(进/借位标志)

举个粟子:

将 dx:ax 中存放的32位无符号数减去BX内的16位无符号数

sub ax,bx ; 结果的低16位,如果ax小于bx将产生借位,导致CF=1

sbb dx,0 ; 高16位-CF,若前一步出现借位,则据此调整高16位的内容


cmp指令:

cmp 是比较指令,cmp 的功能相当于减法指令,只是不保存结果。

cmp 指令执行后,将对标志寄存器产生影响。

其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

cmp指令格式: cmp 操作对象1,操作对象2

功能:计算 操作对象1 - 操作对象2 ,但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。

例如指令 cmp ax,ax , 做 (ax)-(ax) 的运算,结果为0,但并不在ax中保存,

仅影响flag的相关各位 。 指令执行后: zf=1 ,pf=1 ,sf=0 ,cf=0 ,of=0 。

比如:


mov ax,8
mov bx,3
cmp ax,bx

执行后: (ax)=8, zf=0 ,pf=1 ,sf=0 ,cf=0 ,of=0 。

通过cmp指令执行后,相关标志位的值就可以看出比较的结果。

cmp ax,bx

如果 (ax)=(bx) ,则 (ax)-(bx)=0 ,所以:zf=1 ;

如果 (ax)≠(bx) ,则 (ax)-(bx)≠0 ,所以:zf=0 ;

如果 (ax)<(bx) ,则 (ax)-(bx) 将产生借位,所以:cf=1 ;

如果 (ax)≥(bx) ,则 (ax)-(bx) 不必借位,所以:cf=0 ;

如果 (ax)>(bx) ,则 (ax)-(bx) 既不必借位,结果又不为0 ,所以:cf=0 并且 zf=0 ;

如果 (ax)≤(bx) ,则 (ax)-(bx) 既可能借位,结果可能为0 ,所以:cf=1 或 zf=1 ;

指令 cmp ax,bx 的逻辑含义是比较 ax 和 bx 中的值,如果执行后:

zf=1 ,说明 (ax)=(bx)

zf=0 ,说明 (ax)≠(bx)

cf=1 ,说明 (ax)<(bx)

cf=0 ,说明 (ax)≥(bx)

cf=0 并且 zf=0 , 说明 (ax)>(bx)

cf=1 或 zf=0 ,说明 (ax)≤(bx)

  • 32
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余十步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值