x86后x86 jnz?

时间:2010-06-06 11:39:54

标签: assembly x86 conditional xor ida

使用IDA Pro反汇编x86 dll之后,我找到了这段代码(我在pusedo-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指令后如何工作?

5 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

我几乎不知道汇编,但除了将xor设置为xor操作的结果之外,cmp在此上下文中与eax几乎完全相同

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

答案 2 :(得分:3)

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

你的第二个例子没有代码正义,因为你的代码是使用常量值,而不是从内存加载的值。

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

有关详细信息,请参阅xorjnz

答案 3 :(得分:0)

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

答案 4 :(得分:0)

嗯,JNZ是条件跳转,特别是跳跃,如果不是零。

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