2017-04-02 50 views
3

我正在处理我的任务,并且有几个问题。MIPS组装问题

  1. 我是否必须始终将参数/返回值寄存器推入堆栈?如果答案是肯定的,我该怎么做?在呼叫者或被叫程序中?

  2. 我想优化我的指令。我不知道如果我可以改变从

    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)取决于调用约定。 2)优化中的'$ v1'发生了什么? – Michael

+0

我没有使用$ v1 – Lalita

回答

1

MIPS划分成登记保存,无防腐剂类别。保存的寄存器包括$s0 – $s7(因此它们的名称已保存)。非保留寄存器包括$t0 – $t9(因此它们的名称是临时的)。一个函数必须保存和恢复它希望使用的任何保存寄存器,但它可以自由地更改非保留寄存器。

被调用者必须保存并恢复它希望使用的任何保存的 寄存器。被调用者可以更改任何非保留的 寄存器。因此,如果调用者在非保留寄存器中保存活动数据,调用者在进行函数调用之前需要保存未保留的寄存器,然后需要在之后进行恢复。

出于这些原因,保留 寄存器也被称为被调用者保存和无防腐剂寄存器被称为 调用者保存