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

时间:2016-06-26 12:45:25

标签: mips

我不太了解MIPS,因为明年我们必须在大学里做,但今年我们必须与lex和yacc合作,当然我们需要了解MIPS。几个小时前我刚刚学到了一些东西,但是例如我们有' a = -2'和' b = -a',我知道对于' a = -2'我们有类似的东西' addi $ 1,$ 0,-2'以及' b = -a'我们有类似的东西'移动$ 2,$ 31'。我理解,直到这里,但我想知道一些事情。 31美元是注册地点' b'会被存储?如果是,那个登记册上有什么特别之处?为什么不能以30美元或29美元的价格存储?这是因为31美元是最后一次注册?

2 个答案:

答案 0 :(得分:1)

MIPS中的31美元寄存器是返回地址寄存器。它由调用函数保存。它可以在保存后使用。

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

答案 1 :(得分:1)

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

的影响

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

$0又名$zero硬连线到零值。其他寄存器可用于任何目的,但大多数编译器和大多数程序都遵守ABI的寄存器使用惯例。

因此,$1又名$at是"汇编程序临时"。这是因为mips只有相等/不等式的条件分支指令(例如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可以做什么和不可以做什么的更多信息,请参阅我的回答:Whether $ra register callee saved or caller saved in mips?