188

重複の可能性:
x86 アセンブリ - eax に対する 'testl' eax?

私はアセンブリ言語プログラミングに非常に慣れていません。現在、バイナリから生成されたアセンブリ言語を読み取ろうとしています。走ってきた

 test   %eax,%eax

またはtest %rdi, %rdi、などなど。これが何をするのか、私は非常に混乱しています。値が%eax, %eax同じではありませんか?それは何をテストしていますか?操作を行っていることをどこかで読みましたAND.....しかし、それらは同じ値であるため、単に返され%eaxませんか?

以下は、この使用法を見つけた 1 つの例です。

   400e6e:       85 c0                   test   %eax,%eax
   400e70:       74 05                   je     400e77 <phase_1+0x23>

je比較する 2 つの値が等しい場合にジャンプする と思ったのですが……そうですね%eax、それ自体、どのような状況でジャンプしないのでしょうか?

プログラミング初心者なので、どなたか教えていただけるとありがたいです。ありがとう!

4

5 に答える 5

215

CMPオペランドを減算し、フラグを設定します。つまり、差がゼロの場合 (オペランドが等しい場合) にゼロ フラグを設定します。

TESTZFAND 演算の結果がゼロの場合、ゼロ フラグ を設定します。2 つのオペランドが等しい場合、ビットごとの AND は、両方がゼロのときにゼロになります。また、結果の最上位ビットが設定されている場合はTEST符号フラグ を設定し、設定されたビット数が偶数の場合はパリティ フラグ を設定します。SFPF

JE[等しい場合にジャンプ] ゼロ フラグをテストし、フラグが設定されている場合はジャンプします。JEJZ[Jump if Zero] のエイリアスであるため、逆アセンブラはオペコードに基づいて 1 つを選択できません。の引数が等しいJE場合にゼロフラグが設定されるため、このような名前が付けられています。CMP

そう、

TEST %eax, %eax
JE   400e77 <phase_1+0x23>

%eaxがゼロの場合はジャンプします。

于 2012-10-25T08:53:58.903 に答える
62

一部の x86 命令は、オペランド (レジスタ) の内容をそのままにして、ゼロフラグ (ZF) などの特定の内部 CPU フラグを設定/設定解除するように設計されています。ZF は、CPU 内に存在する true/false ブール値フラグと考えることができます。

この特定のケースでは、TEST 命令はビットごとの論理 AND を実行し、実際の結果を破棄し、論理の結果に従って ZF を設定/設定解除します。結果がゼロの場合は ZF = 1 を設定し、それ以外の場合は ZF = 0 を設定します。

JE のような条件付きジャンプ命令は、ZF を参照してジャンプする/しないように設計されているため、TEST と JE を一緒に使用することは、特定のレジスタの値に基づいて条件付きジャンプを実行することと同じです。

例:

TEST EAX,EAX
JE some_address



CPU は、ZF = 1 の場合にのみ、つまり AND(EAX,EAX) = 0 の場合にのみ「some_address」にジャンプします。これは、EAX == 0

の場合にのみ発生します。同等の C コードは次のとおりです。 :

if(eax == 0)
{
    goto some_address
}
于 2012-10-25T09:02:49.530 に答える
18

これEAXはゼロかどうかをチェックします。命令は引数間でtestビットごとに実行され、ゼロが含まれている場合、結果は ZF または ZeroFlag を設定します。ANDEAX

于 2012-10-25T08:53:39.937 に答える
5

testは非破壊and的で、操作の結果は返されませんが、それに応じてフラグ レジスタが設定されます。実際に何をテストするかを知るには、次の手順を確認する必要があります。jz多くの場合、out はレジスタを 0 に対してチェックするために使用され、場合によっては条件付きジャンプと組み合わされます。

于 2012-10-25T08:59:26.763 に答える
4

そうです、test「and」が 2 つのオペランドです。しかし、結果は破棄されます。残っているのはフラグだけです。これが重要な部分です。testそれらは設定されており、それが命令が使用される(そして存在する)理由です。

JE等しければジャンプしない(前の命令が比較だった場合の意味を持つ)、実際には、ZFフラグが設定されているときにジャンプします。そして で設定するフラグの一つなのでtest、この命令列(test x,x; je...)はxが0の時にジャンプするという意味があります。

このような質問 (および詳細) については、x86 命令に関する本をお勧めします。たとえば、それが非常に大きい場合でも、Intel のドキュメントは非常に適切で正確です。

于 2012-10-25T08:54:03.953 に答える