彙編中的test和cmp指令

2021-09-27 13:45:04 字數 1869 閱讀 2440

看過破解教程,都知道test,cmp是比較關鍵,來分析一下它們究竟是怎麼比較

首先看看:狀態暫存器(即標誌暫存器)

psw(program flag)程式狀態字(即標誌)暫存器,是乙個16位暫存器,由條件碼標誌(flag)和控制標誌構成,

如下所示:

條件碼:

①of(overflow flag)溢位標誌,溢位時為1,否則置0.標明乙個溢位了的計算,如:結構和目標不匹配.

②sf(sign flag)符號標誌,結果為負時置1,否則置0.

③zf(zero flag)零標誌,運算結果為0時置1,否則置0.

④cf(carry flag)進製標誌,進製時置1,否則置0.注意:carry標誌中存放計算後最右的位.

⑤af(auxiliary carry flag)輔助進製標誌,記錄運算時第3位(半個位元組)產生的進製置。有進製時1,否則置0.

⑥pf(parity flag)奇偶標誌.結果運算元中1的個數為偶數時置1,否則置0.

控制標誌位:

⑦df(direction flag)方向標誌,在串處理指令中控制資訊的方向。

⑧if(interrupt flag)中斷標誌。

⑨tf(trap flag)陷井標誌。

為舉例方便說一下jnz和jz

測試條件

jz   zf=1

jnz zf=0

jz=jump if zero (結果為0則設定zf零標誌為1,跳轉)

jnz=jump if not zero

好,接著來看test和cmp

test屬於邏輯運算指令

功能: 執行bit與bit之間的邏輯運算

測試(兩運算元作與運算,僅修改標誌位,不回送結果).

test對兩個引數(目標,源)執行and邏輯操作,並根據結果設定標誌暫存器,結果本身不會儲存。test ax,bx 與 and ax,bx 命令有相同效果

語法: test r/m,r/m/data

影響標誌: c,o,p,z,s(其中c與o兩個標誌會被設為0)

運用舉例:

1.test用來測試乙個位,例如暫存器:

test eax, 100b;          b字尾意為二進位制

jnz ******; 如果eax右數第三個位為1,jnz將會跳轉

我是這樣想的,jnz跳轉的條件是zf=0,zf=0意味著zf(零標誌)沒被置位,即邏輯與結果為1.

2.test的乙個非常普遍的用法是用來測試一方暫存器是否為空:

test ecx, ecx

jz somewhere

如果ecx為零,設定zf零標誌為1,jz跳轉

cmp屬於算術運算指令

功能: 比較兩個值(暫存器,記憶體,直接數值)

語法: cmp r/m,r/m/data

標誌位: c,p,a,z,o

cmp比較.(兩運算元作減法,僅修改標誌位,不回送結果).

cmp實際上是只設定標誌不儲存結構的減法,並設定z-flag(零標誌).

零標誌很像carry,也是內部標誌暫存器的一位.

例如:

cmp eax, 2;       如果eax-2=0即eax=2就設定零標誌為1

jz ****; 如果設定了零標誌就跳轉

結論

test邏輯與運算結果為零,就把zf(零標誌)置1;

cmp 算術減法運算結果為零,就把zf(零標誌)置1.

彙編test和cmp區別

看過破解教程,都知道test,cmp是比較關鍵,可是我一直不清楚它們究竟是怎麼比較的,最後下決心找了很多資料,和大家一起把它們弄清楚.首先看看 狀態暫存器 即標誌暫存器 psw program flag 程式狀態字 即標誌 暫存器,是乙個16位暫存器,由條件碼標誌 flag 和控制標誌構成,如下所示...

組合語言 test 和 cmp 區別

from 看過破解教程,都知道 test,cmp 是比較關鍵,可是我一直不清楚它們究竟是怎麼比較的,最後下決心找了很多資料,和大家一起把它們弄清楚.首先看看 狀態暫存器 即標誌暫存器 psw program flag 程式狀態字 即標誌 暫存器,是乙個16位暫存器,由條件碼標誌 flag 和控制標誌...

彙編基礎 cmp彙編指令

cmp是比較指令,cmp的功能相當於減法指令。它不儲存結果,只是影響相應的標誌位。其他的指令通過識別這些被影響的標誌位來得知比較結果。cmp指令格式 cmp 操作物件1,操作物件2 計算 操作物件1 操作物件2 但不儲存結果,只是根據結果修改相應的標誌位。舉例假如此時eax 0h 那麼cmp eax...