2016-06-24 8 views
-3

ケース1:レジスタは使用しているアセンブリje、jns、jle?

cmp dword ptr[ebp + 18],00 
mov eax, [ebp + 14] 
je Game.exe+417442 

ケース2:

test eax,eax 
jns Game.exe+47137 

が、それは常にEAXレジスタを見ていますか?もしそうでなければ、ジャンプを決めるためにどのような見当があるのか​​をどのように知っていますか?

+0

一部の命令はフラグ(特にmov)を変更しません。したがって、ケース1の場合、 'je'は' cmp'によって設定されたフラグを使用しています。ケース2では、 'jns'は' test'で設定されたフラグを使用しています。 –

+1

最初の例では、 'eax'を見ていません。命令 'mov eax、[...]'は前の 'cmp'命令で設定された' Z'(またはany)フラグには影響しません。 –

+0

ありがとう、私はちょっと混乱していると思う。これは独立したフラグですよね?どのレジスターにも住んでいないのですか?したがって、アセンブリ全体で使用するフラグは常に1つだけです。 – Zanko

答えて

5

x86 Jccccは条件コード)は、(R|E)FLAGS registerを使用して条件が満たされているかどうかを判断します。フラグは、以前のさまざまな命令によって更新することができます。従来のx86アセンブリでは、通常、ジャンプ命令の前にフラグを設定するためにcmpまたはtest命令を使用します。

cmpのドキュメントをthis instruction referenceに、testについては、いずれの汎用レジスタもオペランドとして許可されていることがわかります。あなたがあなた自身のアセンブリコードを書いているときに私はcmptestがフラグに影響を与えだけの操作ではありませんのでご注意

は、ちょうど、彼らは通常、あなたがジャンプ条件が満たされているかどうかを判断するために使用する操作です。

+3

'cmp'と' test'はフラグをセットするためによく使われますが、算術演算とビット単位命令の* all *もそうです。初心者はそれらに遭遇する可能性が高い。実際、彼らはしばしば算術演算やビット演算をしてから、 'cmp'や' test'をやって、後者が冗長であることに気付かずに間違えてしまいます。 –

関連する問題