【问题标题】:GOTPCREL(%rip) in GAS Intel syntaxGAS Intel 语法中的 GOTPCREL(%rip)
【发布时间】:2019-03-23 13:54:47
【问题描述】:

我如何在 GAS 英特尔语法中编写以下内容: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 语法快速编写?

【问题讨论】:

    标签: assembly x86-64 gnu-assembler intel-syntax got


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      当使用 Intel 语法时,GAS 对 RIP 相对寻址的期望语法是 <i>displacement</i>[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 + <i>displacement</i>] 可能还有其他一些形式。

      【讨论】:

      • mov r8, variable@GOTPCREL[rip] - 效果很好。非常感谢。
      • 我不推荐这种形式。它起作用只是偶然的。 official documented version[rip + displacement]
      • @Jester 你的危言耸听是不必要的。这是标准的英特尔语法。您链接的文档不是完整列表,而只是“英特尔和 AT&T 样式内存引用的一些示例”。
      • 您声称您的表单是“预期的”语法,而另一个版本是“也接受的”。我发现的唯一文档另有说明。我不明白坚持记录在案的表格是多么“危言耸听”。虽然页面的底部确实显示了示例,但在最顶部它清楚地定义了语法的外观:section:[base + index*scale + disp]。此外,拆卸也会产生这种形式。
      • @Jester 就像您的回答一样,GNU Assembler 文档是半途而废且懒惰的。它也没有记录@GOTPCREL,但它的工作并非偶然。
      猜你喜欢
      • 2019-07-11
      • 1970-01-01
      • 2021-06-17
      • 2023-03-06
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      相关资源
      最近更新 更多