MIPS 和 $31,无法理解为什么数据存储在 $31 寄存器中

MIPS and $31, can't understand why data is stored in register $31

我不太了解 MIPS,因为我们明年在大学必须这样做,但是,今年我们必须使用 lex 和 yacc,当然我们需要了解 MIPS。几个小时前我才知道一些关于它的东西,但是例如如果我们有 'a=-2' 和 'b=-a',我知道对于 'a=-2' 我们有类似的东西 'addi , [=15=], -2',并且对于'b=-a' 我们有类似的东西 'move , '。直到这里我才明白,但我想知道一些事情。 $31 是存放 'b' 的寄存器?如果是的话,那个寄存器有什么特别之处?为什么不能存储在 $30 或 $29 中?是因为$31是最后注册的吗?

MIPS 中的

$31 寄存器是 return 地址寄存器。它由调用函数保存。保存后即可使用

但是没有针对它的检查。它可以像任何其他通用寄存器一样在 lw 指令中使用。

寄存器分配基于编译器的分配方案,受制于 mips ABI http://www.cs.uwm.edu/classes/cs315/Bacon/Lecture/HTML/ch05s03.html

因此,如果您有两个变量:ab,编译器可以将它们分配给可用于给定目的的任何寄存器。寄存器 </code> 又名 <code>$ra 是 return 地址寄存器。保留数据值不是一个好的选择,因为 $ra 硬连线到 jal 指令中。

[=18=] 又名 $zero 硬连接到零值。其他寄存器可用于任何目的,但大多数编译器和大多数程序都遵守 ABI 的寄存器使用约定。

因此,</code> 又名 <code>$at 是 "assembler temporary"。这是因为mips只有equality/inequality的条件分支指令(例如beq/bne)而没有(例如blt)。所以,它有一个 slt 指令,它接受一个输出寄存器,通常是 $at 寄存器

对于你的序列:

a = -2;
b = -a;

假设 a 已分配给 $t0b 已分配给 $t1。生成的序列将是:

    addi    $t0,$zero,-2            # a = -2
    sub     $t1,$zero,$t0           # b = -a

此外,有关 $ra 可以做什么和不能做什么的更多信息,请在此处查看我的回答: