MOV与带指针的LEA
当我尝试在之前的MIPS组装课程中访问堆栈中的变量时,我随机记住了我专门使用了LA(我猜测它是MIPS等效的LEA)。 但是,在x86 32 intel中,我意识到我主要使用mov访问堆栈中的变量。 我知道LEA加载地址,并将地址存储在一个寄存器中,然后通过取消引用来更改以获取该地址处的值。
我看到eax将等于esp + 4在这两种情况下解除引用。 在这种情况下使用一种方法的好处是什么? 我写了这段代码,通过我很好奇的方式获得函数的参数。我的MIPS课程的教授告诉我们要避免使用mov,我不记得他为什么会这样做。
mov $eax [$esp+4]
VS
lea $eax [$esp+4]
mov $eax [$eax]
MIPS la
与x86 mov reg, imm32
:这是一个将地址常量放入寄存器的伪指令。 它只适用于实际的常量,不像可以使用任何寻址模式的LEA。
MIPS没有真正的move
指令; move $t1, $t0
是一个伪操作
or $t1, $zero, $t0
,也就是$t1 = 0 | $t0 = $t0
$t1 = 0 | $t0 = $t0
。 如果你需要复制一个寄存器,你可以把它写成move
而不是addu
or
用零寄存器。 (但是通常在MIPS中,你可以避免复制寄存器,因为指令有一个单独的目的地,不像x86那里add
指令执行dst += src
而不是dst = src1 + src2
。)
x86寻址模式可以直接使用32位常量,并且可用的寄存器更少。 直接使用地址而不是首先将其放入寄存器通常是有意义的。 例如add eax, [my_array + ecx*4]
。 请参阅参考内存位置的内容。 (x86寻址模式)。
MIPS只有一种寻址模式:寄存器+ 16位立即数。 对于小地址(地址空间的低16位),可以直接使用它们,例如ls $t0, my_static_variable($zero)
或lw $t0, my_array($t1)
。 (但是当然你没有缩放索引,所以你必须addui $t1, $t1, 4
来索引下一个元素)。