Режим относительной 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.