使用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指令后如何工作?
答案 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]
中的内容更改每次执行。
答案 3 :(得分:0)
算术运算,如xor设置比较标志(就像比较指令一样)。
答案 4 :(得分:0)
嗯,JNZ是条件跳转,特别是跳跃,如果不是零。
如果操作结果为零,则XOR(以及许多其他算术/逻辑运算)将设置状态寄存器的零标志。所以在你的情况下,它说“做XOR,如果结果不为零(即如果两个数字不同),跳转到这个位置。