我是编程中的总菜鸟。 我最近开始学习装配。 我在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)
作为源操作数?
非常感谢,伙计
答案 0 :(得分:0)
你无法将你能想到的任何操作数传递给汇编指令;虽然汇编语法平滑了一些差异,并且可以让你认为任何操作数被允许,事实上,具有不同类型操作数的相同汇编指令被转换为不同的操作码,并且它们仅被定义为少数操作数类型组合。
这是否意味着我们只能使用
n(%ebp)
作为源操作数?
原则上,它取决于具体的指令;对于大多数指令,您可以使用内存操作数作为源操作数或目标操作数,但不能同时使用两者。
查看at the reference documentation for mov
¹:没有变量需要两个内存操作数(尽管存在操作数作为源或目标的变体);你必须通过临时登记。
对于imul
,同样,look at the documentation:没有带有两个内存操作数的变体,你必须通过一个寄存器(通常是eax
,因为它的编码更紧凑)。