看過破解教程,都知道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邏輯操作,並根據結果設定標誌暫存器,結果本身不會儲存。est 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 區別
from 看過破解教程,都知道 test,cmp 是比較關鍵,可是我一直不清楚它們究竟是怎麼比較的,最後下決心找了很多資料,和大家一起把它們弄清楚.首先看看 狀態暫存器 即標誌暫存器 psw program flag 程式狀態字 即標誌 暫存器,是乙個16位暫存器,由條件碼標誌 flag 和控制標誌...
彙編中的test和cmp指令
看過破解教程,都知道test,cmp是比較關鍵,來分析一下它們究竟是怎麼比較 首先看看 狀態暫存器 即標誌暫存器 psw program flag 程式狀態字 即標誌 暫存器,是乙個16位暫存器,由條件碼標誌 flag 和控制標誌構成,如下所示 條件碼 of overflow flag 溢位標誌,溢...
彙編中的TESP和CMP區別
test屬於邏輯運算指令 功能 執行bit與bit之間的邏輯運算 測試 兩運算元作與運算,僅修改標誌位,不回送結果 test對兩個引數 目標,源 執行and邏輯操作,並根據結果設定標誌暫存器,結果本身不會儲存。test ax,bx與and ax,bx命令有相同效果 語法test r m,r m da...