1

我如何编写以下内容:movq variable@GOTPCREL(%rip), %r8在 GAS Intel 语法中?

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

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

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

我更喜欢 Intel 语法,我的代码主要使用。在将代码移植到 GAS 时,此切换器很不方便。是否可以用 Intel 语法快速编写它?

4

2 回答 2

1

这是标准的有效地址语法。因此,你把它写成mov r8, [variable@GOTPCREL + rip]

于 2018-10-18T17:58:19.903 回答
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]

于 2018-10-18T18:02:53.110 回答