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]
и, возможно, некоторые другие формы.