GOTPCREL (% rip) в синтаксисе GAS Intel - PullRequest
0 голосов
/ 18 октября 2018

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

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

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

0 голосов
/ 18 октября 2018

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

...