特定の x86 命令を .intel_syntax を使用して適切にアセンブルし、-m32 (つまり 32 ビット モード) でコンパイルしようとすると、非常に大きな問題が発生します。次のようなコードがある場合:
#define STACK_SIZE 0x4000
.att_syntax
movl $(stack + STACK_SIZE), %esp
.comm stack, STACK_SIZE
...すべて良好。これから逆コンパイルされた出力は次のようになります (最初に AT&T 構文、次に Intel 構文を示します)。
100010: bc 70 5a 10 00 mov $0x105a70,%esp
100010: bc 70 5a 10 00 mov esp,0x105a70
ただし、コードを次のように変更すると (「動作するはず」と感じます):
.intel_syntax noprefix
mov esp, stack + STACK_SIZE
...代わりに次の出力が得られます。
100010: 8b 25 70 5a 10 00 mov 0x105a70,%esp
100010: 8b 25 70 5a 10 00 mov esp,DWORD PTR ds:0x105a70
明らかに、これは間違っています。スタック ラベルを逆参照しようとしているのではなく、スタック ラベルへの参照を作成しています。
今のところ、私の回避策は、ファイルの一部に AT&T 構文を使用し、残りの部分に Intel 構文を使用することです。これはクラッジのように感じます。残念ながら、GAS Intel モードに関する情報は少しまばらに感じられます。このページはいくつかのヒントを提供しましたが、実際には何も役に立ちませんでした.
よろしくお願いします。あなたに報奨金を与えるのに十分な評判があれば、私はそうします。:)