GAS Intel语法中的GOTPCREL(%rip)

时间:2018-10-18 17:11:03

标签: assembly gas intel-syntax got

如何使用GAS Intel语法编写以下内容:movq variable@GOTPCREL(%rip), %r8

.intel_syntax noprefix仅允许这样做:mov r8, variable@GOTPCREL,它不了解(),并且结果代码不同-我收到分段错误。如何指定相对RIP寻址?

此刻,我必须使用以下语法切换器:

.att_syntax
movq variable@GOTPCREL(%rip), %r8
.intel_syntax noprefix

我更喜欢Intel语法,并且我的代码主要使用 it 。将代码移植到GAS时,此切换器带来不便。可以用Intel语法很快写出来吗?

2 个答案:

答案 0 :(得分:1)

这是标准的有效地址语法。这样,您将其写为mov r8, [variable@GOTPCREL + rip]

答案 1 :(得分:0)

使用Intel语法时,GAS期望RIP相对寻址的语法为displacement[rip]。例如:

    .att_syntax
    movq variable@GOTPCREL(%rip), %r8
    .intel_syntax noprefix
    mov r8, variable@GOTPCREL[rip]
$ as test.s
$ objdump -d -r

a.out:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <.text>:
   0:   4c 8b 05 00 00 00 00    mov    0x0(%rip),%r8        # 0x7
                        3: R_X86_64_REX_GOTPCRELX       variable-0x4
   7:   4c 8b 05 00 00 00 00    mov    0x0(%rip),%r8        # 0xe
                        a: R_X86_64_REX_GOTPCRELX       variable-0x4

GAS还将接受[rip + displacement]以及其他一些形式。