0

特定の 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 モードに関する情報は少しまばらに感じられます。このページはいくつかのヒントを提供しましたが、実際には何も役に立ちませんでした.

よろしくお願いします。あなたに報奨金を与えるのに十分な評判があれば、私はそうします。:)

4

2 に答える 2

1

それは正しいようです。に関する情報があまりないというのは正しいです.intel_syntax。ソースコードで名前を見つけたギャルに手紙を書き、ドキュメントがあるかどうか尋ねました。彼女は、Intel から入手したものをリバース エンジニアリングしただけだと答えました。ソースを調べてみると、offset flat:(当時は) 必須であることがわかりました - コロンも必須でした! 今では、単純offsetに機能しているように見えます...さらに多くのドキュメントも利用できる可能性があります(?)。

Nasm は同じツールチェーンで動作すると考えるべきです...いいえ?

于 2013-04-23T22:10:09.920 に答える