4

重複の可能性:
LEA命令の目的は何ですか?

アドレスの値が必要な場合は、実効アドレスを使用できますpush dword [str+4]。しかし、アドレスを参照する必要がある場合は、使用できませんpush dword str+4(これは、私にとっては明白で直感的な方法です)。

代わりに、を使用する必要がありlea EAX, [str+4]ますpush EAX。これは少し紛らわしく、「ゼロクロック」命令ではありますが、追加のプロセッサ命令も提供します。(この回答を参照してください)

この違いについてハードウェアレベルの説明はありますか、それとも(NASM)アセンブリ構文の癖ですか?

編集: さて、このコメントは私と同じ質問をします。そして、このコメントでは、Luceroの回答と同じように回答されています。X86はそのようなアドレス指定をサポートしていません。

4

4 に答える 4

4

正しい構文を使用するだけで、 offsetキーワードが必要になります。

 push offset str+4

LEA命令は、アドレス生成ロジックの配管を使用するのに便利です。ALUを使用しない非常に安価な加算と乗算の方法を提供します。コードジェネレーターを作成するプログラマー向けのトリックのリストの上位にあります。ここでは必要ありません、afaict。

于 2012-08-18T13:18:38.783 に答える
2

これは(質問に答えないので)長いコメントですが、読者は知っておくべきです。

lea確かにゼロクロック命令ではありません。fxchSandy Bridgeには、(レジスタの名前が変更されたすべてのものに)、nop90および)などのいくつかがあり、0F 1FSandy Bridgeにも、レジスタをゼロに設定するための特定のイディオムがあります(xorまたはsubXMMレジスタの場合も同様です)。もちろん、スループットはまだ制限されているため、無料ではありません。

lea常に少なくとも1サイクルかかります(少なくとも、私が知っているプロセッサでは、常にこのようになっているとは限りません)。通常、AGUではなくALUで実行されます(一部のAMDとAtomは例外です)が、 AGUで実行された場合でも、1サイクル以上かかります。P4、Sandy Bridge(この投稿でSBについて多く言及しているようです)、AMDプロセッサleaなど、1サイクル以上かかることもあります。lea実際、AMD K10ではlea、AGUに送られるのは遅いケースであり、スケーリングされているか、3つの引数があり、ALUに送られる速いものよりもサイクルが長くなります。

于 2012-08-18T13:18:28.867 に答える
0

アセンブリ命令はx86オペコードを直接表します(高級言語のように変換コンパイルは行われません)。オペコードには、表現できるものに制限があります。そのため、x86アドレス指定の一部としてアドレスの計算は可能ですが、値の計算はできません。LEAは、アドレス計算の結果を内部で消費するのではなく、任意のレジスタに格納することで、このギャップを埋めます。

于 2012-08-18T12:45:53.007 に答える
0

それはCのように見え始めるからです。この種のインライン加算を使用できる唯一の場所は、メモリをアドレス指定するときです。LEAアドレスを指定せずにメモリを「アドレス指定」できます。これは、小さなポインタのミスステップによってアプリケーションが強制終了されるプロテクトモードで非常に役立ちます(ポインタのミスステップによってDOS、Windows、マシンが強制終了され、強制終了される可能性があるリアルモードではさらに便利です。任意の数)。アセンブリは、各命令が物理回路に対応する限定された獣です。指示がそのまま一般的であるということは、それ自体が小さな奇跡です。

于 2012-08-18T14:24:56.390 に答える