'mov' 和 'imul' 的内存引用过多

Too many memory reference for 'mov' and 'imul'

我完全是编程菜鸟。 我最近开始学习汇编。 我用 32 位做 AT&T Ubuntu

当我编码时:

movl 12(%ebp), -4(%ebp)

imull 12(%ebp), -4(%ebp)

出现错误信息:Too many memory reference for 'mov' and 'imul'

为什么我们不能使用 -4(%ebp) 而不是像 %eax 这样的普通寄存器作为占位符

是否意味着我们只能使用n(%ebp)作为源操作数?

非常感谢,伙计们

你不能将你能想到的任何操作数传递给汇编指令;虽然汇编语法消除了一些差异并且可以让你认为任何操作数都是允许的,但实际上具有不同类型操作数的相同汇编指令被翻译成不同的操作码,并且它们仅为少数操作数类型组合定义。

Does it mean that we can only use n(%ebp) as a source operands?

原则上要看具体说明;对于大多数指令,您可以将内存操作数用作源操作数或目标操作数,但不能同时用作两者。

at the reference documentation for mov¹:没有采用两个内存操作数的变体(尽管存在将内存操作数作为源或目标的变体);你必须通过临时登记。

至于imul,同样,look at the documentation:没有两个内存操作数的变体,你必须通过一个寄存器(通常是eax,因为它的编码更紧凑).


  1. 阅读文档时,请记住 rXX(XX 为 8、16、32 或 64)表示 "a general purpose XX bits register",r/mXX 表示 "a general purpose XX bits register or memory operand",immXX 表示 "an XX bits immediate value" .此外,大多数文档都采用 Intel 语法,因此如果您习惯使用 AT&T,则必须颠倒操作数顺序。