7

在使用 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     ...

在异或指令之后条件跳转指令如何工作?

4

5 回答 5

12

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

于 2010-06-06T11:44:54.490 回答
4

我几乎不知道汇编,但在这种情况下,除了设置xor 操作的结果之外,它的作用与我所说xor的几乎相同。cmpeax

换句话说,在 , 之后xoreax如果其先前的值是 0 d6h(否则,它将是某个值!= 0)。此外,将设置零标志(与 一样)cmp,以便您可以jnz测试该标志。

于 2010-06-06T11:43:01.333 回答
3

eax如果 in 的值最终不为零,它将跳转。

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

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

有关详细信息,请参阅xorjnz

于 2010-06-06T11:43:28.477 回答
0

像 xor 这样的算术运算设置比较标志(就像比较指令一样)。

于 2010-06-06T11:44:19.273 回答
0

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

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

于 2010-06-06T11:45:14.810 回答