【问题标题】:Why cant I move a stack value into another stack value? [duplicate]为什么我不能将堆栈值移动到另一个堆栈值? [复制]
【发布时间】: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 ] 是一条有效指令,它将数据从一个堆栈内存位置移动到另一个。

标签: assembly x86


【解决方案1】:

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

【讨论】:

  • 这个问题有无数个重复项,请关闭而不是重新回答常见问题。请参阅stackoverflow.com/tags/x86/info 的常见问题解答部分以获取此类副本的链接。
猜你喜欢
  • 2022-10-17
  • 1970-01-01
  • 2012-02-15
  • 2011-11-26
  • 2013-12-26
  • 2023-03-03
  • 1970-01-01
  • 2019-04-26
  • 2019-08-08
相关资源
最近更新 更多