JNZ& CMP装配说明

时间:2013-02-12 20:25:44

标签: assembly x86 reverse-engineering ollydbg cmp

如果我错了,请纠正我。

这是我对JNZCMP的了解。

JNZ - 如果Z标志不为零(1)

,将发生跳转

CMP - 如果两个值相等,则设置Z标志(1),否则不设置(0)

Olly DBG

这是我正在观看的flash教程。它正在教一个简单的CrackMe解决方案。

如您所见,上一条说明将AL47h进行了比较。它们相等,设置了Z标志。 (您可以在右侧的“注册”窗口中看到它)

下一条指令是JNZ。我的理解是,如果设置Z标志,将发生跳转。设置了Z标志,但跳转没有发生!

为什么?

5 个答案:

答案 0 :(得分:31)

JNZ是“如果不为零(ZF = 0)”的缩写,“如果设置了ZF则跳转”。

如果它更容易记住,请考虑JNZ和JNE(如果不相等则跳跃)是等效的。因此,当您正在执行cmp al, 47并且AL的内容等于47时,ZF已设置,不应该跳跃(如果不等于 - JNE)。

答案 1 :(得分:19)

我会在这里做出更广泛的回答。

在x86中通常会说两种类型的条件跳转:

  1. 算术跳跃 - 如JZ(如果为零则跳跃),JC(如果进位则跳转),JNC(如果不进行则跳转)等

  2. 比较跳跃 - JE(如果相等则跳跃),JB(如果低于此跳跃),JAE(如果超过或等于跳跃)等等

  3. 因此,仅在算术或逻辑指令之后使用第一种类型:

    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 
    

答案 2 :(得分:2)

首先,如果不是零(0),似乎JNZ意味着跳跃,如果零标志为1 /设置,则跳转为跳跃。

但实际上它意味着跳跃(如果)不是零(已设置)。

如果0 =未设置且1 =已设置,则只需记住:
JNZ如果未设置零标志(0)

,则跳转

答案 3 :(得分:0)

JNZ     Jump if Not Zero    ZF=0

确实,这是令人困惑的。

为了便于理解,请将非零替换为未设置。 (请注意这是为了您自己的理解)

因此,

JNZ     Jump if Not Set     ZF=0

未设置表示标志Z = 0.因此跳转(如果未设置则跳转)

设置表示标志Z = 1.因此,请勿跳转

答案 4 :(得分:0)

您可以将JNE / Z读为*

如果 E qual / Z ero标志的状态为“ N 其他”,则

J / p>

“未设置” 是将CPU中的“等于/零标志”设置为0时的状态,仅在满足条件或相等条件时才会发生。