看過破解教程,都知道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...