当前位置:鱼C工作室 >汇编语言 > 查看文章

标志寄存器04 – 零基础入门学习汇编语言57

第十一章:标志寄存器04

 

让编程改变世界

Change the world by program


 

cmp指令

 

下面我们再来看一下如果用cmp来进行有符号数比较时,我们要注意哪些标志位!

我们以cmp ah,bh为例进行说明:

如果(ah)=(bh) 则(ah)-(bh)=0,所以:ZF=1;

如果(ah)≠(bh) 则(ah)-(bh) ≠0,所以:ZF=0;

所以,我们根据cmp指令执行后ZF的值,就可以知道两个数据是否相等。

 

我们继续看,如果(ah)<(bh)则可能发生什么情况呢?

对于有符号数运算,在 (ah)<(bh) 情况下,(ah)-(bh)显然可能引起SF=1,即结果为负。

 

比如:(ah) = 1,(bh) = 2:

则 (ah)-(bh)=0FFH,0FFH 为 -1 的补码,因为结果为负,所以SF=1。

 

(ah)=0FEH,(bx)=0FFH:

则(ah)-(bh)=(-2)-(-1)=0FFH,因为结果为负,所以SF=1。

 

通过上面的例子,我们是不是可以得到这样的结论:

cmp 操作对象1,操作对象2 指令执行后,SF=1,就说明操作对象1<操作对象2?当然不是!!

 

我们再看下面这个例子。

(ah)=22H,(bh)=0A0H:

则(ah)-(bh)=34-(-96)=130=82H,82H是 -126的补码,所以SF=1。

这里虽然SF=1,但是并不能说明(ah)<(bh),因为显然34>-96。

两个有符号数A 和B 相减,得到的是负数,那么可以肯定A<B,这个思路没有错误;

 

关键在于我们根据什么来断定得到的是一个负数。

CPU将 cmp 指令得到的结果记录在flag的相关标志位中。

我们可以根据指令执行后,相关标志位的值来判断比较的结果。

 

单纯地考察SF 的值不可能知道结果的正负。因为SF 记录的只是可以在计算机中存放的相应位数的结果的正负。

比如add ah, al执行后,SF记录的是ah中的8位二进制信息所表示的数据的正负。

所得到的相应结果的正负,并不能说明,运算所应该得到的结果的正负。

这是因为在运算的过程中可能发生溢出。

 

如果有这样的情况发生,那么,SF的值就不能说明任何问题。

如果没有溢出发生的话,那么,实际结果的正负和逻辑上真正结果的正负就一致了。

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

 

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

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

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

因SF=1,实际结果为负,所以逻辑上真正的结果为负,所以(ah)<(bh)。

 

分页阅读: 1 2 下一页
为您推荐

报歉!评论已关闭.