【发布时间】:2018-05-06 22:33:57
【问题描述】:
我用 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: 错误:64 位模式不支持 32 位绝对寻址
movl x, %eax;
^
我还尝试通过首先在x 前面添加$ 字符来移动值,但是会引发clang 错误:
clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
有谁知道x中存储的值如何成功移动到%eax?我在 Mac OSX 上使用 x86 程序集并使用 gcc 进行编译。
【问题讨论】:
-
使用
movl x(%rip), %eax。 -
@Jester 谢谢你,
x(%rip)工作!如果你能写一个带有解释的答案,我会接受。 -
错误信息略显不诚实。是的,
movl x, %eax受架构支持,但您不应该使用它。 -
@fuz:在 AT&T 语法中,
moffs形式的mov(具有 64 位绝对地址)使用movabs助记符,所以简单的mov意味着你想要 @ 987654339@ 带有 ModR/M 字节的操作码。 MachO64 输出格式根本不支持 32 位绝对重定位,并且图像基地址在 OS X 上高于 2^32,因此[disp32]寻址模式无法工作。因此对于mov,RIP-relative 是唯一的选择。
标签: macos assembly x86-64 att relative-addressing