我正在完成我的任务,我有几个问题。
我是否必须始终将参数/返回值寄存器推送到堆栈?如果答案是肯定的,我该怎么办?在来电或被叫程序中?
我正在尝试优化我的指示。我想知道我是否可以改变
slt $t0, $a0, a1 #check if a<b
beq $t0,$zero, ELSE #if $a>b, $t0 = 0, go to else
addi $v0, $zero,1 #a<b, return 1
j exit #end if, jump to exit
ELSE: addi $v1, $zero, 0 #a>b, return 0
exit: jr $ra #return to address
到
slt $v0, $a0, a1 #if a<b, $v0 =1 and if a>b, $v0 = 0
jr $ra #return to address
答案 0 :(得分:1)
MIPS将寄存器划分为保留和非保留类别。保留的寄存器包括$s0 – $s7
(因此保存了它们的名称)。非保留寄存器包括$t0 – $t9
(因此它们的名称是临时的)。函数必须保存和恢复它希望使用的任何保留寄存器,但它可以自由地更改非保留寄存器。
被叫方必须保存并恢复任何保留的内容 注册它希望使用。被调用者可以改变任何未保存的 寄存器。因此,如果调用者在非保留寄存器中保存活动数据, 调用者需要在进行函数调用之前保存该非保留寄存器,然后需要将其恢复。
由于这些原因,保留了下来 寄存器也称为 callee-save ,并调用非保留寄存器 呼叫者保存