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)
posted @ 2013-03-20 11:12  过江千尺浪  阅读(2345)  评论(0编辑  收藏  举报
沪江小D在线词典