7

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 命令の後の条件付きジャンプ命令はどのように機能しますか?

4

5 に答える 5

12

ほとんどの命令と同様xorに、前の操作の結果に応じてプロセッサの状態フラグを設定します。この場合、 の結果xorがゼロの場合、Z フラグが設定されます。命令は Z フラグをテストし、設定されていないjnz場合は分岐します。

于 2010-06-06T11:44:54.490 に答える
4

私はアセンブリについてほとんど知りませんが、このコンテキストでは、xor 操作の結果に設定することに加えて、私が言うxorのとほとんど同じことを行います。cmpeax

言い換えると、 の後にxoreax前の値が 0 だった場合は正確に 0 になりますd6h(そうでない場合は、何らかの値 != 0 になります)。さらに、ゼロ フラグが設定されるので ( と同様) 、そのフラグをテストcmpできます。jnz

于 2010-06-06T11:43:01.333 に答える
3

の値がゼロにならない場合はジャンプeaxします。

2 番目の例では、コードがメモリから読み込まれた値ではなく定数値を使用しているため、コードの正義は行われません。

最初の例では、これらすべての値をメモリからロードし、そのxor上で を実行します。メモリの内容は、2 番目の例とは異なり、 と の内容に応じて実行ごとに変わる場合が[ebx+84h]あり[esi+84h]ます。

詳細については、 xorおよびjnzを参照してください。

于 2010-06-06T11:43:28.477 に答える
0

xor などの算術演算は、比較フラグを設定します (比較命令と同様)。

于 2010-06-06T11:44:19.273 に答える
0

JNZ は条件付きジャンプです。具体的には、ゼロでない場合はジャンプします。

XOR (および他の多くの算術/論理演算) は、演算の結果がゼロの場合、ステータス レジスタのゼロ フラグを設定します。したがって、あなたの場合、「XORを実行し、結果がゼロでない場合(つまり、2つの数値が異なる場合)、この場所にジャンプします。

于 2010-06-06T11:45:14.810 に答える