cmp指令

1.cmp是比较指令,cmp的功能是相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器得知比较结果。

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

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

2.问题:cmp 操作对象1,错做对象2指令执行后,SF=1,就说明操作对象1<操作对象2?

当然不是。

例子:

mov ah,22H

mov bh,A0H

sub ah,bh

结果SF=1,运算实际结果是(ah)=82H,但逻辑上,运算结果应该是34-(-96)=130。就是因为130这个结果作为一个有符号数超出-128~127这个返回,在ah中不能表示,而ah中的结果被CPU当做有符号数解释为-126。而SF被用来记录这个实际结果的正负,所以SF=1。但SF=1不能说明在逻辑上运算的正确结果的正负。

但是逻辑上的结果的正负,才是cmp指令所求的真正结果,因为我们就是要靠它得到两个操作对象的比较信息。所以cmp指令所作的比较结果,不是仅仅靠SF就能记录的,因为它只能记录实际结果的正负。

我们考虑一下,两种结果之间的关系,实际结果的正负,和逻辑上真正结果的正负,它们之间有多大的差距呢?从上面的分析中,我们知道,实际结果的正负,只所以不能说明逻辑上真正结果的正负,关键的原因在于发出溢出。如果没有溢出发生的话,那么,实际结果的正负和逻辑上真正的结果的正负就一致了。

所以,我们应该在考察SF(得知实际结果的正负)的同时考察OF(得知有没有溢出),就可以得知逻辑上真正结果的正负,同时就可以知道比较的结果。

下面,我们以cmp ah,bh为例,总结一下CPU执行cmp指令后,SF和OF的值是如何来说明比较的结果:

(1)如果SF=1,而OF=0

OF=0,说明没有溢出,逻辑上真正结果的正负=实际记过的正负。

SF=1,即使结果为负,所以(ah)<(bh)

(2)如果SF=1,而OF=1

OF=1,说明有溢出,逻辑上真正结果的正负!=实际结果的正负

SF=1,实际结果为负

实际结果为负,而又有溢出,这说明是由于溢出导致实际结果为负,简单分析一下,就可以看出,如果因为溢出导致实际结果为负,那么逻辑上真正的结果必然为正。这样说明(ah)>(bh)

(3)SF=0,而OF=1

如果因为溢出导致实际结果为正,那么逻辑上真正的结果必然为负,所以(ah)<(bh)

(4)如果SF=0,而OF=0

SF非负,且无溢出,所以(ah)>=(bh)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值