使用两个 64 位寄存器时 'mov' 的引用过多?

too many references for 'mov' when using two 64-bit registers?

我正在尝试编译一个非常简单的程序,但出现了 2 个我无法修复的错误:

1.s:13:Error: too many memory references for 'mov'
1.s:15:Error: too many memory references for 'lea'

这是我的代码,希望有人看到我的错误。

.intel_syntax noprefix
.data
message: .asciz "Hello World\n"
.text
.global main
main:
    push rbp
    mov rbp, rsp
    lea rdi, message
    call printf
    mov rax, 0
    pop rbp
    ret
    

代码 assembles + links 对我来说很好,在我的 x86-64 Arch GNU/Linux 系统上:
gcc -no-pie foo.S

这些错误消息与我通过 gcc -c -m32 foo.S 得到的消息相匹配,所以您可能使用的是 32 位系统,其中 -m32 是您的 GCC 的默认设置。 如果 gcc -m64 -no-pie 有效,你可以 assemble + link ,否则你必须将系统升级到 64 位。

在32位模式下,RBP等不是寄存器名,所以GAS只是把它们当作未知的符号名。当然 x86 doesn't allow instructions with two explicit memory operands 喜欢 mov mem2, mem1。 (并且 lea 需要一个寄存器目的地,并且 mov rax, 0 还存在关于存储的不明确操作数大小的错误。)

(我不得不使用 -no-pie 因为你写 lea rdi, message 而不是 lea rdi, [rip+message] 来使用 RIP 相对寻址 instead of 32-bit absolute: