Невозможно переместить переменные в .data в регистры с Mac x86 Assembly - PullRequest
0 голосов
/ 07 мая 2018

Я написал небольшой фрагмент сборки с синтаксисом AT & T и в настоящее время объявил три переменные в разделе .data. Однако, когда я пытаюсь переместить любую из этих переменных в регистр, такой как %eax, возникает ошибка из gcc. Код и сообщение об ошибке ниже:

.data
  x:.int 14
  y:.int 4
  str: .string "some string\n"

.globl _main

_main:
  pushq %rbp
  movq %rsp, %rbp
  subq $16, %rsp
  movl x, %eax; #attempting to move the value of x to %eax;
  leave
  ret

Возникла ошибка:

call_function.s: 14: 3: ошибка: 32-битная абсолютная адресация не поддерживается в 64-битном режиме

movl x,% eax;

^

Я также попытался переместить значение, сначала добавив символ $ перед x, однако возникает ошибка clang:

clang: error: сбой команды компоновщика с кодом выхода 1 (используйте -v для просмотра вызова)

Кто-нибудь знает, как значение, сохраненное в x, может быть успешно перемещено в %eax? Я использую сборку x86 на Mac OSX и компилирую с gcc.

1 Ответ

0 голосов
/ 07 мая 2018

Режим относительной RIP-связи является единственным хорошим вариантом для адресации статических данных в MacOS ; базовый адрес образа больше 2 ^ 32, поэтому 32-битные абсолютные адреса не могут использоваться даже в позиционно-зависимом коде (в отличие от x86-64 Linux). Относительная к RIP адресация статических данных не зависит от позиции, поэтому она работает даже в независимых от позиции исполняемых файлах (ASLR) и библиотеках.

movl x(%rip), %eax - это синтаксис AT & T для RIP-относительного.

mov eax, dword ptr [rip+x] в ГАЗ .intel_syntax noprefix.

Или, чтобы получить адрес символа в регистре, lea x(%rip), %rdi


Синтаксис NASM: mov eax, [rel x], или используйте default rel, поэтому [x] относителен к RIP.

См. 64-разрядный формат Mach-O не поддерживает 32-разрядные абсолютные адреса. NASM Accessing Array для получения дополнительной информации о том, что может делать в OS X, например movabs x, %eax будет возможно, потому что регистр назначения AL / AX / EAX / RAX. (64-битный абсолютный адрес, но не делайте этого, потому что он больше и не быстрее, чем относительная загрузка RIP.)

См. Также http://felixcloutier.com/x86/MOV.html.

...