我不太了解MIPS,因为明年我们必须在大学里做,但今年我们必须与lex和yacc合作,当然我们需要了解MIPS。几个小时前我刚刚学到了一些东西,但是例如我们有' a = -2'和' b = -a',我知道对于' a = -2'我们有类似的东西' addi $ 1,$ 0,-2'以及' b = -a'我们有类似的东西'移动$ 2,$ 31'。我理解,直到这里,但我想知道一些事情。 31美元是注册地点' b'会被存储?如果是,那个登记册上有什么特别之处?为什么不能以30美元或29美元的价格存储?这是因为31美元是最后一次注册?
答案 0 :(得分:1)
MIPS中的31美元寄存器是返回地址寄存器。它由调用函数保存。它可以在保存后使用。
但是没有对此进行检查。它可以像任何其他通用寄存器一样用在lw指令中。
答案 1 :(得分:1)
寄存器分配基于编译器的分配方案,受mip ABI http://www.cs.uwm.edu/classes/cs315/Bacon/Lecture/HTML/ch05s03.html
的影响因此,如果您有两个变量:a
和b
,编译器可以将它们分配给任何可用于给定目的的寄存器。寄存器$31
又名$ra
是返回地址寄存器。保留数据值不是一个好的选择,因为$ra
被硬连线到jal
指令中。
$0
又名$zero
硬连线到零值。其他寄存器可用于任何目的,但大多数编译器和大多数程序都遵守ABI的寄存器使用惯例。
因此,$1
又名$at
是"汇编程序临时"。这是因为mips只有相等/不等式的条件分支指令(例如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
可以做什么和不可以做什么的更多信息,请参阅我的回答:Whether $ra register callee saved or caller saved in mips?