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
因此,如果您有两个变量:a
和 b
,编译器可以将它们分配给可用于给定目的的任何寄存器。寄存器 </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
已分配给 $t0
,b
已分配给 $t1
。生成的序列将是:
addi $t0,$zero,-2 # a = -2
sub $t1,$zero,$t0 # b = -a
此外,有关 $ra
可以做什么和不能做什么的更多信息,请在此处查看我的回答:
我不太了解 MIPS,因为我们明年在大学必须这样做,但是,今年我们必须使用 lex 和 yacc,当然我们需要了解 MIPS。几个小时前我才知道一些关于它的东西,但是例如如果我们有 'a=-2' 和 'b=-a',我知道对于 'a=-2' 我们有类似的东西 'addi , [=15=], -2',并且对于'b=-a' 我们有类似的东西 'move , '。直到这里我才明白,但我想知道一些事情。 $31 是存放 'b' 的寄存器?如果是的话,那个寄存器有什么特别之处?为什么不能存储在 $30 或 $29 中?是因为$31是最后注册的吗?
$31 寄存器是 return 地址寄存器。它由调用函数保存。保存后即可使用
但是没有针对它的检查。它可以像任何其他通用寄存器一样在 lw 指令中使用。
寄存器分配基于编译器的分配方案,受制于 mips ABI http://www.cs.uwm.edu/classes/cs315/Bacon/Lecture/HTML/ch05s03.html
因此,如果您有两个变量:a
和 b
,编译器可以将它们分配给可用于给定目的的任何寄存器。寄存器 </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
已分配给 $t0
,b
已分配给 $t1
。生成的序列将是:
addi $t0,$zero,-2 # a = -2
sub $t1,$zero,$t0 # b = -a
此外,有关 $ra
可以做什么和不能做什么的更多信息,请在此处查看我的回答: