使用Intel语法在GNU汇编器中进行位置独立寻址

时间:2013-11-14 17:41:06

标签: assembly x86-64 gas intel-syntax

在x86-64上,当使用带有 intel语法的GNU汇编程序时,如何以与位置无关的方式(PIC和PIE兼容)从.data部分加载地址。

例如,使用AT& T语法,您可以这样做:

leaq mystring(%rip), %rdi

英特尔语法是否相同?我似乎无法使用搜索引擎找到答案......

我实际上正在使用英特尔语法的noprefix版本,以防万一。

由于

1 个答案:

答案 0 :(得分:2)

回答这个问题的简单方法是将指令汇编到目标文件中,然后用英特尔语法对其进行反汇编。您可以使用类似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