【发布时间】:2018-08-29 20:38:33
【问题描述】:
我正在通过反复试验学习 x86(_64) 汇编。我想做的一件事是将堆栈中的值从 -4 移动到 -8,但 GNU 汇编器似乎不喜欢这样:
error: invalid operand for instruction
movl -4(%rsp), -16(%rsp)
我不知道为什么。对我来说,从逻辑上讲,将偏移量 -4 处的值从堆栈移动到 -16。
【问题讨论】:
-
您可以,但只能使用现有说明。检查您的 CPU ISA 文档以查看存在哪些指令(要在 x86 上以单指令将内存移动到内存,您可以使用
movs指令,但单次移动的设置成本很高,使用 2x @ 更有意义987654323@ 带有备用寄存器来临时存储值)。编辑 “对我来说它在逻辑上是有意义的” - 是的,但是汇编不是普通的编程语言并且不符合逻辑意义。这几乎是将硬件指令 1:1 映射为文本形式,因此从硬件芯片设计而非 PL 来看,它更有意义。 -
即“从反复试验中学习 x86(_64) 组装” 要求非常艰难...当然反复试验在组装学习中非常重要,但如果没有理论第一部分,它将完全失败痛...
-
push qword [ rsp + somewhereinstack ]是一条有效指令,它将数据从一个堆栈内存位置移动到另一个。