test和cmp指令

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章