2013-02-12 101 views
15

糾正我,如果我錯了。JNZ和CMP組裝說明

這是我對JNZCMP的理解。

JNZ - 跳轉將於如果Z標誌不是零(1)

CMP - 如果這兩個值相等,則Z標誌被設置爲(1),否則它沒有被設置(0)

Olly DBG

這是一個Flash教程中,我看着。它正在將解決方案教給一個簡單的CrackMe。

正如您所看到的,前面的指令將AL47h進行了比較。他們是平等的,設置了Z的標誌。 (您可以在右側的寄存器窗口中看到它)

下一條指令是JNZ。我的理解是,如果設置了Z標誌,跳轉將發生。 Z標誌已設置,但不會發生跳轉!

爲什麼?

+1

@nrz你的評論不是很清楚 - OP是否期望通過真正地看待這個陳述來實現這個錯誤,真的很難? – 2013-02-12 20:47:48

+0

@nrz Jeez男人你是否想讓我更加迷惑?!?!從其他答案中,現在我知道使用JNZ時,只有零標誌未設置(0) – 2013-02-12 23:04:50

+1

@ 43.52.4D纔會發生跳轉。對不起,我在你的問題中誤讀了「JNZ - 如果Z標記不爲零(1)」,就會發生跳轉,因此我的評論可能會令人困惑,所以現在我刪除了它。 [Intel x86 JUMP快速參考](http://www.unixwiz.net/techtips/x86-jumps.html)有一個用於檢查不同x86條件跳轉的分支條件的有用表格。 – nrz 2013-02-13 00:09:06

回答

24

JNZ是「Jump if not zero(ZF = 0)」的縮寫,NOT「如果ZF已設置則跳轉」。

如果它更容易記住,請考慮JNZ和JNE(如果不相等,則跳轉)是等效的。因此,當你在做cmp al, 47並且AL的內容等於47時,ZF被設置,但是跳躍(如果不等於-JNE)則不應該被採用。

11

我會在這裏做一個更廣泛的答案。

有一般而言兩種條件跳轉的86:

  1. 算術跳 - 像JZ(跳轉如果爲零),JC(跳躍如果進位),JNC(跳躍,如果沒有攜帶)等。

  2. 比較跳躍 - JE(跳躍如果相等),JB(跳躍如果下文),JAE(跳躍如果高於或等於)等

因此,只有算術之後使用所述第一類型或邏輯instruc蒸發散:

sub eax, ebx 
jnz .result_is_not_zero 

and ecx, edx 
jz .the_bit_is_not_set 

後才CMP說明使用第二組:

cmp eax, ebx 
jne .eax_is_not_equal_to_ebx 

cmp ecx, edx 
ja .ecx_is_above_than_edx 

這種方式,程序變得更具可讀性,你將永遠不會被混淆。

請注意,有時這些指令實際上是同義詞。 JZ == JE; JC == JB; JNC == JAE等。完整的表格如下。正如你所看到的,只有16條件跳轉指令,但30個助記符 - 它們被設置成允許的更可讀的源代碼創建:

Mnemonic  Condition tested Description 

jo    OF = 1   overflow 
jno    OF = 0   not overflow 
jc, jb, jnae CF = 1   carry/below/not above nor equal 
jnc, jae, jnb CF = 0   not carry/above or equal/not below 
je, jz   ZF = 1   equal/zero 
jne, jnz  ZF = 0   not equal/not zero 
jbe, jna  CF or ZF = 1  below or equal/not above 
ja, jnbe  CF or ZF = 0  above/not below or equal 
js    SF = 1   sign 
jns    SF = 0   not sign 
jp, jpe   PF = 1   parity/parity even 
jnp, jpo  PF = 0   not parity/parity odd 
jl, jnge  SF xor OF = 1  less/not greater nor equal 
jge, jnl  SF xor OF = 0  greater or equal/not less 
jle, jng (SF xor OF) or ZF = 1 less or equal/not greater 
jg, jnle (SF xor OF) or ZF = 0 greater/not less nor equal 
2

起初它似乎如果不是零(0彷彿JNZ指跳),如在零標誌爲1/set時跳轉。

但實際上這意味着跳躍(如果)不是零(被設置)。

如果=沒有設置0和1 =設置,則只需記住:
JNZ跳轉,如果零標誌未設置(0)

0
JNZ  Jump if Not Zero ZF=0 

事實上,這是混淆了權利。

爲了便於理解,請將不爲零未設爲。 (請注意,這是對自己的理解)

因此,

JNZ  Jump if Not Set  ZF=0 

沒有設定意味着標誌Z = 0。所以跳轉(跳轉如果未設置)

設機構標誌Z = 1 。所以,不要跳