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)
原文:http://blog.csdn.net/getnextwindow/article/details/24884795