cmp是比較指令,cmp的功能相當於減法指令,只是不儲存結果。cmp指令執行後,將對標誌暫存器產生影響。其他相關指令通過識別這些被影響的標誌暫存器位來得知比較結果。

cmp指令格式: cmp 操作物件1,操作物件2

功能:計算操作物件1-操作物件2但並不儲存結果,僅僅根據計算結果對標誌暫存器進行設定。

例如指令cmp ax,ax,做(ax)-(ax)的運算,結果為0,但並不在ax中儲存,僅影響flag的相關各位。指令執行後:zf=1.pf=1,sf=0,cf=0,of=0。

下面的指令:

mov ax,
mov bx,
cmp ax,bx

執行後: (ax)=8, zf=0,pf=1,sf=0,cf=0,of=0。

其實,我們通過cmp指令執行後,相關標誌位的值就可以看出比較的結果。

cmp ax,bx

如果(ax)=(bx),則(ax)-(bx)=0,所以:zf=1;

如果(ax)≠(bx),則(ax)-(bx)≠0,所以:zf=0;

如果(ax)<(bx),則(ax)-(bx)將產生借位,,所以:cf=1;

如果(ax)≥(bx),則(ax)-(bx)不必借位,所以:cf=0;

如果(ax)>(bx),則(ax)-(bx)既不必借位,結果又不為0,所以:cf=0並且zf=0;

如果(ax)≤(bx),則(ax)-(bx)既可能借位,結果可能為0,所以:cf=1或zf=1;

指令cmp ax,bx的邏輯含義是比較ax和bx中的值,如果執行後:

zf=1,說明(ax)=(bx)

zf=0,說明(ax)≠(bx)

cf=1,說明(ax)<(bx)

cf=0,說明(ax)≥(bx)

cf=0並且zf=0,說明(ax)>(bx)

cf=1或zf=0,說明(ax)≤(bx)

上面所講的是用cmp進行有符號數比較時,相關標誌位對比較結果的記錄。如果用cmp來進行有符號數比較時,CPU用哪些標誌位對比較結果進行記錄。例如

cmp ah,bh

如果(ah)=(bh),則(ah)-(bh)=0, 所以:zf=1

如果(ah)≠(bh),則(ah)-(bh)≠0, 所以:zf=0;

所以,根據cmp指令執行後zf的值,就可以知道兩個資料是否相等。

最後以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, 實際結果為負。

實際結果為負,而又有溢位,這說明了是由於溢位導致了實際結果為負,簡單分析一下,就可以看出,如果因為溢位導致了實際結果為負,那麼邏輯上真正的結果必然為正。

這樣,sf=1,of=1,說明了(ah)>(bh)。

3)如果sf=0, 而of=1

of=1, 說明有溢位,邏輯上真正結果的正負≠實際結果的正負;

因sf=0,實際結果非負。而of=1說明有溢位,則結果非0,所以實際結果為正。

實際結果為正,而又有溢位,這說明是由於溢位導致了實際結果非負,簡單分析一下,就可以看出,如果因為溢位導致了實際結果為正,那麼邏輯上真正的結果必然為負。

這樣:sf=0, of=1,說明了(ah)<(bh)。

4)如果sf=0,而of=0

of=0, 說明沒有溢位,邏輯上真正結果的正負=實際結果的正負;

因sf=0,實際結果非負,所以邏輯上真正的結果非負,所以(ah)≥(bh)。