CMP指令

cmp:比较指令,功能相当于减法指令,但不保存结果,执行后将对FLAG产生影响。
格式:cmp 操作对象1,操作对象2
功能:计算操作对象1 - 操作对象2但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。
如:cmp ax,ax,做(ax)-(ax)的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。
指令执行后:zf=1,pf=1,sf=0,cf=0,of=0.

1.cmp进行无符合数比较cmp ax,bx
(1)zf=1                -> (ax)=(bx);
(2)zf=0                -> (ax)!=(bx);

(3)cf=1                -> (ax)<(bx);
(4)cf=0                -> (ax)>=(bx);
(5)cf=0 && zf=0   -> (ax)>(bx);
(6)cf=1 || zf=1    -> (ax)<=(bx).

2.cmp进行有符合数比较cmp ax,bx
    两个有符号数A和B相减,得到的是负数,那么可以肯定A<B,是对的,关键在于我们根据什么来断定得到的是一个负数。单纯的考查sf植不可能知道结果的正负,因为sf记录的只是可以在计算机中存放的相应倍数的结果的正负。所得到的相应结果的正负,并不能说明,运算所应该得到的结果的正负,这是因为运算的过程中可能发生溢出,如果有溢出,单纯SF的值不能说明任何问题。
    逻辑上的结果的正负,才是cmp指令所求的真正结果,要靠它得到两个操作对象的比较信息,所以cmp指令所作的比较结果,不是仅仅靠sf就能记录的,因为它只能记录实际结果的正负。
    如果没有发生溢出,实际结果的正负和逻辑结果的正负一样。反之则相反。
(1)zf=1                -> (ax)=(bx);
(2)zf=0                -> (ax)!=(bx);

(3)sf=1 && of=0        -> (ax)<(bx);

of=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;
因sf=1,实际结果为负,所以逻辑上真正的结果为负,所以(ax)<(bx).

(4)sf=1 && of=1        -> (ax)>(bx);

of=1,说明有溢出,逻辑上真正结果的正负!=实际结果的正负;
因sf=1,实际结果为负。
实际结果为负,而又有溢出,这说明是由于溢出导致了实际结果为负,那么如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。所以(ax)>(bx).

(5)sf=0 && of=0    -> (ax)>=(bx);

of=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;
因为sf=0,实际结果非负,所以逻辑上真正的结果非负,所以(ax)>=(bx).

(6)sf=0 && of=1        -> (ax)<(bx).

of=1,说明有溢出,逻辑上真正结果的正负!=实际结果的正负;
因sf=0,实际结果为非负。 而of=1说明有溢出,则结果非0,所以,实际结果为正。
实际结果为非负,而又有溢出,说明由于溢出导致了实际结果非负。如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负。所以(ax)<(bx)

转载于:https://www.cnblogs.com/driftsand/archive/2013/03/20/2970771.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值