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)。