5

GNU アセンブラーには、一部の命令で生成されるオペコードの代替形式を制御する何らかの手段があるようです。例えば

.intel_syntax noprefix
mov   eax, ecx
mov.s eax, ecx

上記のコードを で処理するとas test.s -o test.o && objdump -d test.o -M intel、次の逆アセンブリが得られます。

0:   89 c8                   mov    eax,ecx
2:   8b c1                   mov    eax,ecx

接尾辞がオペコードをバージョン.sに切り替える(そして ModRM バイトを適切に変更する) ように見えることがわかります。898b

この構文は GAS でどのように機能しますか? 関連するドキュメントが見つかりません。

4

1 に答える 1

3

Binutils 2.29 の時点で、疑似プレフィックスを支持して、命令サフィックスは非推奨になりました。GNU Assembler (pre-2.29) info pagesに記載されている古いサフィックスを見つけることができます。以前のinfo asページには次のように書かれています。

9.15.4.1 命令の命名

[をちょきちょきと切る]

オプションのニーモニック サフィックスを使用して、さまざまなエンコード オプションを指定できます。.sサフィックスは、あるレジスタから別のレジスタに移動するときに、エンコーディングで 2 つのレジスタ オペランドをスワップします。.d8または.d32サフィックスは、エンコーディングで 8 ビットまたは 32 ビットの置換を優先します。

新しい疑似接頭辞の文書化、Binutils 2.29 (およびそれ以降) のinfo asページは次のように改訂されました。

疑似プレフィックスを使用して、さまざまなエンコード オプションを指定できます。

  • {disp8} – 8 ビットの変位を優先します。
  • {disp32} – 32 ビットの置換を優先します。
  • {load} – ロード形式の命令を優先します。
  • {store} – ストア形式の命令を優先します。
  • {vex2} – VEX 命令には 2 バイトの VEX プレフィックスを優先します。
  • {vex3} – VEX 命令に 3 バイトの VEX プレフィックスを優先します。
  • {evex} – EVEX プレフィックスでエンコードします。
于 2017-12-06T17:49:37.327 に答える