簡體   English   中英

JNZ 和 CMP 組裝說明

[英]JNZ & CMP Assembly Instructions

如果我錯了,請糾正我。

這是我對JNZCMP理解。

JNZ - 如果Z標志不為零,則跳轉將發生 (1)

CMP - 如果兩個值相等,則設置Z標志 (1) 否則不設置 (0)

奧利DBG

這是我正在觀看的 Flash 教程。 它正在教一個簡單的 CrackMe 的解決方案。

如您所見,上47h指令將AL47h進行了比較。 它們相等,設置了Z標志。 (您可以在右側的寄存器窗口中看到它)

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

為什么?

JNZ 是“如果不為零則跳轉(ZF = 0)”的縮寫,而不是“如果設置了 ZF 則跳轉”。

如果更容易記住,請考慮 JNZ 和 JNE(如果不相等則跳轉)是等價的。 因此,當您執行cmp al, 47並且AL的內容等於 47 時,ZF 已設置,因此不應進行跳轉(如果不等於 - JNE)。

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

在 x86 中一般有兩種類型的條件跳轉:

  1. 算術跳轉 - 如 JZ(如果為零則跳轉)、JC(如果進位則跳轉)、JNC(如果沒有進位則跳轉)等。

  2. 比較跳轉 - JE(如果相等則跳轉)、JB(如果低於則跳轉)、JAE(如果高於或相等則跳轉)等。

因此,僅在算術或邏輯指令之后使用第一種類型:

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 and 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 

起初,JNZ 似乎意味着如果不是零 (0) 則跳轉,就像在零標志為 1/set 時跳轉一樣。

但實際上它意味着跳轉(如果)不為零(設置)。

如果 0 = 未設置且 1 = 設置,請記住:
如果未設置零標志 (0),則 JNZ 跳轉

JNZ     Jump if Not Zero    ZF=0

確實,這是令人困惑的權利。

為了更容易理解,將Not Zero替換為Not Set (請注意,這是您自己的理解)

因此,

JNZ     Jump if Not Set     ZF=0

未設置意味着標志 Z = 0。所以跳轉(如果未設置則跳轉)

設置意味着標志 Z = 1。所以,不要跳轉

您可以將 JNE/Z 讀作 *

ĴUMP如果狀態是E上QUAL / Z ERO標志“N OT集”

“未設置”是當 CPU 中的“相等/零標志”設置為 0 時的狀態,這僅在條件滿足或相等匹配時發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM