GOTPCREL(%rip) в синтаксисе GAS Intel

Как я могу написать следующее: movq variable@GOTPCREL(%rip), %r8 в синтаксисе ГАЗ Intel?

.intel_syntax noprefix позволяет только это: mov r8, variable@GOTPCRELне понимает ()и полученный код отличается - я получаю ошибку сегментации. Как я могу указать RIP-относительную адресацию?

На данный момент я должен использовать следующий переключатель синтаксиса:

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

Я предпочитаю синтаксис Intel, и мой код использует его в основном. Этот переключатель неудобен при портировании кода на ГАЗ. Можно ли в ближайшее время написать его в синтаксисе Intel?

2 ответа

Это стандартный эффективный синтаксис адреса. Таким образом, вы пишете это как mov r8, [variable@GOTPCREL + rip]

Синтаксис, который GAS ожидает для относительной адресации RIP при использовании синтаксиса Intel: 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

ГАЗ также примет [rip + displacement] и, возможно, некоторые другие формы.

Другие вопросы по тегам