首先,la不是 MIPS 硬件指令,只是汇编器实现的伪指令,如li. (通常用lui/addiu在寄存器中构造一个 32 位的符号地址,如果你按正常方式使用它的话la $reg, symbol)。查看反汇编/机器代码输出,例如 MARS 在您组装时向您显示。
您可以通过使用寄存器寻址模式而不是符号名称la来滥用。move(move是另一个伪指令;MIPS 没有硬件移动,您只需添加 with$zero或立即数0。)
如果汇编器选择了那个,那la它就可以准确地addi $a0, $s5, 0组装起来。(虽然它更有可能选择 addiu;立即数不是 0 必须不捕获有符号溢出。一般来说,你永远不需要 add/addi,只需要 addu/addiu。)
2 将 $s5 的地址存储在 $a0 中,但我们需要一个值,而不是地址。这会由 print_integer 自动处理吗?
不,无论哪种方式,值$a0都是相同的,就像您确实move $a0, $s5喜欢正常人一样。所以 print_integer 整理出来的最终结果没有区别。
您不能获取寄存器的地址。寄存器可以保存内存地址,但您不能获取寄存器的地址。
是la的“获取其源操作数的地址”,但请注意,这0($s5)不是寄存器,它是内存寻址模式的语法,它引用 in 地址处的内存$s5,就像您可以使用 with 一样lw。该内存的地址只是$s5.
C 等效项是int *a0 = &*s5; & 取消一元*解引用的地方。