Assembly 为什么我不能将一个堆栈值移动到另一个堆栈值中?

Assembly 为什么我不能将一个堆栈值移动到另一个堆栈值中?,assembly,x86,Assembly,X86,我正在通过反复试验学习x86(_64)汇编。我想做的一件事是将堆栈中的值从-4移到-8,但GNU汇编程序似乎不喜欢这样: error: invalid operand for instruction movl -4(%rsp), -16(%rsp) 我不知道为什么。对我来说,从逻辑上讲,将偏移量-4处的堆栈中的值移动到-16是有意义的。MOV没有操作码,其中源和目标都是内存地址。您需要从寄存器移动到寄存器(或两者都移动)。要将一个值从一个堆栈位置复制到另一个堆栈位置,只需将其移动到寄存

我正在通过反复试验学习x86(_64)汇编。我想做的一件事是将堆栈中的值从-4移到-8,但GNU汇编程序似乎不喜欢这样:

error: invalid operand for instruction
    movl -4(%rsp), -16(%rsp)

我不知道为什么。对我来说,从逻辑上讲,将偏移量-4处的堆栈中的值移动到-16是有意义的。

MOV没有操作码,其中源和目标都是内存地址。您需要从寄存器移动到寄存器(或两者都移动)。要将一个值从一个堆栈位置复制到另一个堆栈位置,只需将其移动到寄存器中,然后再移动到目标位置。

可以,但只能使用现有的指令。检查您的CPU ISA文档以查看存在哪些指令(要在x86上以单指令的形式将内存移动到内存,可以使用
movs
指令,但单次移动的设置成本太高,因此使用2x
mov
和备用寄存器临时存储值更有意义)。编辑“对我来说,它在逻辑上是有意义的”-是的,但汇编语言不是正常的编程语言&不符合逻辑意义。它几乎是硬件指令到文本形式的1:1映射,因此它从硬件芯片设计而不是PL.I.e.中更有意义。“从试错中学习x86(_64)汇编”要求的是非常艰难的过程。。。当然,在汇编学习中,尝试和错误是非常重要的,但是如果没有第一部分的理论,这将是一件非常痛苦的事情。
push-qword[rsp+somewhereinstack]
是一条有效的指令,它将数据从一个堆栈内存位置移动到另一个堆栈内存位置。这个问题有无数的重复,请关闭,而不是重新回答常见问题。有关此类副本的链接,请参见的常见问题部分。