x86 32 intel - MOV vs LEA with pointers

时间:2017-12-11 04:42:57

标签: x86

我随机记得在尝试在先前的MIPS组装过程中访问堆栈中的变量时,我专门使用了LA(我猜测它是LEA的MIPS等价物)。但是,在x86 32 intel中,我意识到我主要使用mov来访问堆栈中的变量。我知道LEA加载一个地址,并将地址存储在寄存器中,然后通过解引用来更改以获取该地址处的值。

我发现在两种情况下,eax将等于esp + 4解除引用。在这种情况下,使用一种方法比另一种方法有什么好处? 我写了这段代码来获取函数的参数 我很好奇,我的MIPS课程的教授告诉我们要避免使用mov我不记得他为什么会这样做。

mov $eax [$esp+4]

VS

lea $eax [$esp+4]
mov $eax [$eax]

1 个答案:

答案 0 :(得分:0)

MIPS la与x86 mov reg, imm32相同:它是用于将地址常量放入寄存器的伪指令。 适用于实际常量,不像LEA可以使用任何寻址模式。

MIPS没有真正的move指令; move $t1, $t0是一个伪操作 or $t1, $zero, $t0,即它$t1 = 0 | $t0 = $t0。如果您需要复制寄存器,您也可以使用零寄存器将其写为move而不是adduor。 (但通常在MIPS中,您可以避免复制寄存器,因为指令具有单独的目标,与x86不同,add指令执行dst += src而不是dst = src1 + src2。)

x86寻址模式可以直接使用32位常量,并且可用的寄存器要少得多。通常直接使用地址而不是先将其放入寄存器中是有意义的。例如add eax, [my_array + ecx*4]。请参阅Referencing the contents of a memory location. (x86 addressing modes)

MIPS只有一种寻址模式:寄存器+ 16位立即数。对于小地址(在地址空间的低16位),您可以直接使用它们,例如ls $t0, my_static_variable($zero)lw $t0, my_array($t1)。 (但是你当然没有缩放索引,所以你必须addui $t1, $t1, 4索引下一个元素。)