看過破解教程,都知道test,cmp是比較關鍵,可是我一直不清楚它們究竟是怎麼比較的,最後下決心找了很多資料,和大家一起把它們弄清楚.
首先看看:狀態寄存器(即標誌寄存器)
PSW(Program Flag)程序狀態字(即標誌)寄存器,是一個16位寄存器,由條件碼標誌(flag)和控制標誌構成,
如下所示:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
條件碼:
①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