2017-04-02 109 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(因此它們的名稱是臨時的)。一個函數必須保存和恢復它希望使用的任何保存寄存器,但它可以自由地更改非保留寄存器。

被調用者必須保存並恢復它希望使用的任何保存的 寄存器。被調用者可以更改任何非保留的 寄存器。因此,如果調用者在非保留寄存器中保存活動數據,調用者在進行函數調用之前需要保存未保留的寄存器,然後需要在之後進行恢復。

出於這些原因,保留 寄存器也被稱爲被調用者保存和無防腐劑寄存器被稱爲 調用者保存