我使用AT&T语法编写了一小段汇编代码,并在 部分声明了三个变量。但是,当我尝试将这些变量中的任何一个移动到寄存器中(例如%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: error: 64位模式不支持32位绝对地址寻址
movl x, %eax;
^
我还尝试在x
前面添加$
字符来移动值,但是会出现clang
错误:
clang: 错误: 链接器命令执行失败,退出码为1 (使用 -v 查看调用)
有没有人知道如何将存储在x
中的值成功地移动到%eax
中?我正在Mac OSX上使用x86汇编,并使用gcc
进行编译。
movl x(%rip), %eax
。 (注:该指令将从程序计数器加上偏移量x处读取一个32位的值,然后将其存储到寄存器eax中)。 - Jesterx(%rip)
可以工作!如果您能写一篇带有解释的答案,我会接受它。 - Ajax1234movl x, %eax
被架构支持,但你不应该使用它。 - fuzmov
的moffs
形式(使用64位绝对地址)使用movabs
助记符,因此普通的mov
意味着您想要带有ModR / M字节的mov r32,r / m32
操作码。 MachO64输出格式根本不支持32位绝对重定位,并且图像基地址在OS X上超过2 ^ 32,因此[disp32]
寻址模式无法工作。 因此,对于mov
,RIP相对是唯一的选择。 - Peter Cordes