如何使用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语法很快写出来吗?
答案 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]
以及其他一些形式。