'' mov'内存引用太多和' imul'

时间:2018-01-24 07:20:44

标签: assembly cpu-registers operands

我是编程中的总菜鸟。 我最近开始学习装配。 我在32位Ubuntu中做AT& T

当我编码时:

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

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

有错误消息:Too many memory reference for 'mov' and 'imul'

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

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

非常感谢,伙计

1 个答案:

答案 0 :(得分:0)

你无法将你能想到的任何操作数传递给汇编指令;虽然汇编语法平滑了一些差异,并且可以让你认为任何操作数被允许,事实上,具有不同类型操作数的相同汇编指令被转换为不同的操作码,并且它们仅被定义为少数操作数类型组合。

  

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

原则上,它取决于具体的指令;对于大多数指令,您可以使用内存操作数作为源操作数或目标操作数,但不能同时使用两者。

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

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

  1. 在阅读文档时,请记住rXX(XX为8,16,32或64)表示“通用XX位寄存器”,r / mXX表示“通用XX位寄存器或存储器操作数”,immXX表示“XX位立即值”。此外,大多数文档都采用Intel语法,因此如果您习惯于AT& T,则必须撤消操作数顺序。