我随机记得在尝试在先前的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]
答案 0 :(得分:0)
MIPS la
与x86 mov reg, imm32
相同:它是用于将地址常量放入寄存器的伪指令。 只适用于实际常量,不像LEA可以使用任何寻址模式。
MIPS没有真正的move
指令; move $t1, $t0
是一个伪操作
or $t1, $zero, $t0
,即它$t1 = 0 | $t0 = $t0
。如果您需要复制寄存器,您也可以使用零寄存器将其写为move
而不是addu
或or
。 (但通常在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
索引下一个元素。)