【问题标题】:x86 jnz after xor?异或后的x86 jnz?
【发布时间】:2010-06-06 11:39:54
【问题描述】:

使用IDA Pro反汇编x86 dll后,我发现了这段代码(我在pusdo-c代码中添加的注释,希望它们是正确的):

test    ebx, ebx        ; if (ebx == false)
jz      short loc_6385A34B ; Jump to 0x6385a34b
mov     eax, [ebx+84h]  ; eax = *(ebx+0x84)
mov     ecx, [esi+84h]  ; ecx = *(esi+0x84)
mov     al, [eax+30h]   ; al = *(*(ebx+0x84)+0x30)
xor     al, [ecx+30h]   ; al = al XOR *(*(esi+0x84)+0x30)
jnz     loc_6385A453

让我更容易理解:

mov     eax, b3h
xor     eax, d6h
jnz     ...

xor 指令后的条件跳转指令如何工作?

【问题讨论】:

    标签: assembly x86 conditional xor ida


    【解决方案1】:

    像大多数指令一样,xor 根据前一个操作的结果设置处理器条件标志。在这种情况下,如果xor 的结果为零,则将设置 Z 标志。 jnz 指令测试 Z 标志并在它设置时分支。

    【讨论】:

    • 所以它也适用于其他逻辑指令?
    • @kotarou3:是的,这些标志的设置是几乎所有算术和逻辑运算的结果。
    【解决方案2】:

    我几乎不知道汇编,但 xor 在这种情况下与 cmp 我想说的几乎相同,除了将 eax 设置为 xor 操作的结果。

    换句话说,在xor 之后,如果eax 之前的值为d6h,那么eax 将为0(否则,它将是某个值!= 0)。 另外,将设置零标志(与cmp 一样),因此您可以jnz 来测试该标志。

    【讨论】:

      【解决方案3】:

      如果eax 中的值不为零,它将跳转。

      您的第二个示例没有正确处理代码,因为您拥有的代码使用的是常量值,而不是从内存中加载的值。

      在第一个示例中,它从内存中加载所有这些值并对其执行xor。与您的第二个示例不同,内存内容可能会根据[ebx+84h][esi+84h] 中的内容在每次执行时发生变化。

      详情请参阅xorjnz

      【讨论】:

      • 感谢您的链接,我在某个地方找到了该网站,但又丢失了
      【解决方案4】:

      算术运算,例如 xor 设置比较标志(就像比较指令)。

      【讨论】:

        【解决方案5】:

        嗯,JNZ 是条件跳转,具体来说,如果不为零则跳转。

        如果运算结果为零,XOR(和许多其他算术/逻辑运算)将设置状态寄存器的零标志。所以在你的情况下,它是说“做异或,如果结果不为零(即如果两个数字不同)跳转到这个位置。

        【讨论】:

          猜你喜欢
          • 2013-09-30
          • 2011-06-12
          • 1970-01-01
          • 2013-01-28
          • 1970-01-01
          • 2012-12-25
          • 2017-06-01
          • 2021-05-21
          • 2019-05-30
          相关资源
          最近更新 更多