使用两个 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: )
我正在尝试编译一个非常简单的程序,但出现了 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: