3

x86-64 で、GNU アセンブラーをintel 構文で使用するときに、位置に依存しない方法 (PIC および PIE 互換) で .data セクションからアドレスをロードするにはどうすればよいですか?

たとえば、AT&T 構文を使用すると、次のことができます。

leaq mystring(%rip), %rdi

Intel 構文に相当するものはありますか? 検索エンジンを使っても答えが見つからないようです...

違いが生じる場合に備えて、実際にnoprefixはインテル構文のバージョンを使用しています。

ありがとう

4

1 に答える 1

2

これに答える簡単な方法は、命令をオブジェクト ファイルにアセンブルし、Intel 構文で逆アセンブルすることです。のようなコマンドを使用できますobjdump -d -Mintel test.o

そのようにすると、次のようになります。

Disassembly of section .text:

0000000000000000 <test>:
   0:   48 8d 3d 00 00 00 00    lea    rdi,[rip+0x0]        # 7 <test+0x7>

そして、それはかなり明確なはずです。mystringが に変わっていることに注意してください0x0: これらのゼロは、の再配置を使用してリンク時に調整されるプレースホルダー バイトですmystring。アセンブリ ソースでは、そこで識別子を使用します。

編集:より明確にするために、ソースファイルの例を次に示します。

    .intel_syntax noprefix
    .globl test
test:
    lea rdi, [rip+mystring]

そして、これが分解です(からobjdump -rd -Mintel test.o)。PC 相対の再配置に注意してください。

0000000000000000 <test>:
   0:   48 8d 3d 00 00 00 00    lea    rdi,[rip+0x0]        # 7 <test+0x7>
                        3: R_X86_64_PC32    mystring+0xfffffffffffffffc
于 2013-11-14T18:39:13.990 に答える