【问题标题】:Can you use mov with an indirect operand as both source and destination?您可以将 mov 与间接操作数一起用作源和目标吗?
【发布时间】:2014-02-16 21:51:47
【问题描述】:

我可以将mov 与间接操作数一起用作源和目标吗?

例如

mov eax, OFFSET foo
mov esi, OFFSET bar
mov [eax],[esi + LENGTHOF bar]

根据我的尝试,我猜你不能因为 invalid instruction operand 错误。但我还没有读到任何明确声明你不能这样做的地方,所以我想确保它不是由于其他一些错误。

【问题讨论】:

  • 有可能在一个特殊情况 ... mov [esp],[...] / mov [...],[esp] 你可以使用push / popm32 内存操作数。缺点(除了隐含需要在esp 中包含第二个地址操作数)是esp 也会发生变化。

标签: assembly x86 masm cpu-registers


【解决方案1】:

x86 mov 指令不支持内存到内存的移动。

看看Volume 2: Instruction Set Reference,即MOV指令。有reg <- regmem <- regreg <- mem 形式,但没有mem <- mem

要将数据从内存移动到内存,必须使用中间寄存器或movs 指令,该指令将值从地址DS:ESI 移动到ES:EDI。这就是这些寄存器被这样命名的原因(源索引和目标索引)。

【讨论】:

  • 啊,好吧。我没有想到这种间接寻址也是内存到内存的。谢谢!很快就会接受。
  • 吹毛求疵:除非您将 movspops 计入内存位置。
  • @500-InternalServerError 谢谢。我已经重新措辞了我的开场白。
猜你喜欢
  • 2020-11-06
  • 2012-09-24
  • 2014-07-28
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多