1. ホーム
  2. アセンブリ

[解決済み] テストのポイント %eax %eax [重複]。

2022-03-03 12:38:43

質問

<ブロッククオート

重複の可能性があります。
x86アセンブリ - 'testl' eaxとeaxの比較?

私はアセンブリ言語プログラミングの超初心者で、現在バイナリから生成されたアセンブリ言語を読もうとしているところです。 私は、以下のものに遭遇しました。

 test   %eax,%eax

または test %rdi, %rdi などなど。これが何をするものなのか、私はとても混乱しています。 の値は %eax, %eax は同じですか? 何をテストしているのでしょうか? どこかで読んだのですが、それは AND という演算が行われますが、同じ値なので %eax ?

以下は、この使い方を発見した一例です。

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

と思ったら je は、比較される2つの値が等しい場合にジャンプします......さて、なぜなら %eax では、どのような状況であればジャンプしないのでしょうか?

プログラミング全般が初心者なので、どなたか解説していただけると大変ありがたいです。 ありがとうございました。

どのように解決するのですか?

CMP はオペランドを引き算し、フラグを設定します。すなわち、差分がゼロ(オペランドが等しい)であればゼロフラグを立てます。

TEST はゼロフラグを設定します。 ZF AND演算の結果が0であるとき。2つのオペランドが等しい場合、そのビット単位のANDは、両方がゼロのときにゼロとなる。 TEST は符号フラグも設定します。 SF 最上位ビットが設定されている場合は,パリティフラグが設定されます。 PF セットされたビットの数が偶数であるとき。

JE [ジャンプ・イフ・イコールズ] ゼロフラグをテストし、フラグがセットされていればジャンプします。 JE のエイリアスです。 JZ [ゼロならジャンプ]なので、ディスアセンブラはオペコードに基づいてどちらかを選択することができません。 JE の引数がゼロの場合、ゼロフラグが設定されるため、このような名前になっています。 CMP は等しい。

だから

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

%eax がゼロの場合。