Aja*_*234 2 macos x86 assembly x86-64 att
我用 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
Run Code Online (Sandbox Code Playgroud)
引发的错误是:
call_function.s:14:3: 错误:64 位模式不支持 32 位绝对寻址
movl x, %eax;
^
我还尝试通过首先$在 前面添加字符来移动值x,但是,clang引发了错误:
clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
有谁知道如何x成功地将存储的值移动到%eax?我在 Mac OSX 上使用 x86 程序集并使用gcc.
RIP 相对寻址模式是在 MacOS 上寻址静态数据的唯一好选择;图像基地址高于 2^32,因此 32 位绝对地址即使在依赖位置的代码中也不可用(与 x86-64 Linux 不同)。静态数据的 RIP 相对寻址与位置无关,因此它甚至可以在与位置无关的可执行文件 (ASLR) 和库中使用。
movl x(%rip), %eax 是 RIP 相关的 AT&T 语法。
mov eax, dword ptr [rip+x]在气体.intel_syntax noprefix。
或者,要将符号的地址放入寄存器, lea x(%rip), %rdi
NASM 语法:mov eax, [rel x],或使用default relso[x]是 RIP 相关的。
请参阅Mach-O 64 位格式不支持 32 位绝对地址。NASM Accessing Array有关您可以在 OS X 上执行的操作的更多背景知识,例如movabs x, %eax可能因为目标寄存器是 AL/AX/EAX/RAX。(64 位绝对地址,但不要这样做,因为它比 RIP 相对加载更大且不快。)
另请参阅http://felixcloutier.com/x86/MOV.html。
| 归档时间: |
|
| 查看次数: |
816 次 |
| 最近记录: |