2012-03-20 8 views
6

IDA Proにファイルを開いたばかりで、まったく役に立たないようなコードがいくつか見つかりました。しかし、私はそれがいくつかの使用を持つかもしれないと思った。 sub eax,0はeaxから0を単に差し引いていませんか?sub eax、0 - それは何ですか?

コード:

hinstDLL= dword ptr 4 
fdwReason= dword ptr 8 
lpReserved= dword ptr 0Ch 

mov  eax, [esp+fdwReason] 
sub  eax, 0 
jz  short loc_10001038 
+3

はい、eaxからゼロを減算します。しかし、*何かをする、それはフラグを設定します。たとえば、0になる唯一の方法は、eaxがゼロから始まる場合です。 – harold

答えて

13

sub命令(documentationに従ってOFSFZFAFPF、及びCF)フラグを設定 - mov命令はありません。 jzは、ゼロフラグ(ZF)が設定されている場合にのみジャンプするので、eaxの値に基づいてジャンプする場合は、そのフラグを適切に設定する必要があります。

+0

あなたはそれにTEST命令を使う必要があると思った。ありがとう! –

+1

'test'は暗黙のビット単位のANDを行いますが、同じフラグのすべてには影響しません。 'test'ドキュメントから:' OF'と 'CF'フラグは' 0'に設定され、結果に応じて 'SF'、' ZF'、 'PF'フラグがセットされます。 'AF'フラグは定義されていません。 –

6

sub命令は、結果がゼロの場合にゼロフラグを設定します。この場合、これは、eaxがゼロの場合にゼロフラグがセットされることを意味します。

したがって、これらの3つの命令は、[esp+fdwReason]がゼロであるかどうかをチェックし、その場合はloc_10001038にジャンプします。

関連する問題