Assembly GAS Intel语法中的GOTPCREL(%rip)

Assembly GAS Intel语法中的GOTPCREL(%rip),assembly,x86-64,gnu-assembler,intel-syntax,got,Assembly,X86 64,Gnu Assembler,Intel Syntax,Got,如何编写以下内容:movqvariable@GOTPCREL(%rip),%r8在GAS英特尔语法中 .intel\u语法noprefix仅允许以下操作:mov r8,variable@GOTPCREL,它不理解(),结果代码不同-我收到分段错误。如何指定RIP相对寻址 此时,我必须使用以下语法切换器: .att_syntax movq variable@GOTPCREL(%rip), %r8 .intel_syntax noprefix 我更喜欢英特尔语法,我的代码主要使用it。在将代码移植

如何编写以下内容:
movqvariable@GOTPCREL(%rip),%r8
在GAS英特尔语法中


.intel\u语法noprefix
仅允许以下操作:
mov r8,variable@GOTPCREL
,它不理解
()
,结果代码不同-我收到分段错误。如何指定RIP相对寻址

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

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

我更喜欢英特尔语法,我的代码主要使用it。在将代码移植到GAS时,此切换器会带来不便。可以用英特尔语法很快编写吗?

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

使用英特尔语法时,GAS希望rip相对寻址的语法是
置换[rip]
。例如:

    .att_syntax
    movq variable@GOTPCREL(%rip), %r8
    .intel_syntax noprefix
    mov r8, variable@GOTPCREL[rip]
$as test.s
$objdump-d-r
a、 输出:文件格式elf64-x86-64
第节的分解。正文:
0000000000000000 :
0:4c 8b 05 00 mov 0x0(%rip),%r8#0x7
3:R_X86_64_REX_gotpcrex变量-0x4
7:4c 8b 05 00 mov 0x0(%rip),%r8#0xe
a:R_X86_64_REX_gotpcrex变量-0x4

气体也将接受
[rip+置换]
和其他形式的气体。

mov r8,variable@GOTPCREL[rip]
-效果很好。非常感谢。我不推荐那种表格。这只是偶然的,它的工作。这是你不必要的恐慌宣传者。
[rip+displacement]
@Jester。这是标准的英特尔语法。您链接的文档不是一个完整的列表,只是“英特尔和AT&t风格内存引用的一些示例”。您声称您的表单是“预期”语法,而另一个版本“也接受”。我发现的唯一文档说明了其他情况。我看不出坚持记录表格是多么“恐慌”。虽然页面的底部确实显示了示例,但在最顶部它清楚地定义了语法的外观:
section:[base+index*scale+disp]
。此外,反汇编也会产生这种形式。@Jester和您的答案一样,GNU汇编程序文档是半途而废和懒惰的。它也不会记录
@GOTPCREL
,但它的工作并不是偶然的。
$ 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