码迷,mamicode.com
首页 > 其他好文 > 详细

cmp指令

时间:2014-05-03 16:46:20      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:style   new   mil   关系   size   c   

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)

cmp指令,布布扣,bubuko.com

cmp指令

标签:style   new   mil   关系   size   c   

原文地址:http://blog.csdn.net/getnextwindow/article/details/24884795

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!