組合語言 test 和 cmp 區別

2021-09-28 21:35:25 字數 1275 閱讀 7835

from:

看過破解教程,都知道 test,cmp 是比較關鍵,可是我一直不清楚它們究竟是怎麼比較的,最後下決心找了很多資料,和大家一起把它們弄清楚.

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

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

如下所示:

條件碼: 

控制標誌位: 

為舉例方便說一下 jnz 和 jz 。測試條件: 

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

jnz zf=0    即  jnz=jump if not zf ( 結果不為 0,則設定 zf 為 0 (0表示假) )

好,接著來看 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 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和cmp區別

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

彙編中的test和cmp指令

看過破解教程,都知道test,cmp是比較關鍵,來分析一下它們究竟是怎麼比較 首先看看 狀態暫存器 即標誌暫存器 psw program flag 程式狀態字 即標誌 暫存器,是乙個16位暫存器,由條件碼標誌 flag 和控制標誌構成,如下所示 條件碼 of overflow flag 溢位標誌,溢...

組合語言 AT T組合語言

這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...