2013-10-28 93 views
0

大家好,我剛剛開始Mips和我有一個程序(函數decleration)我無法理解它的某些部分。是否有人幫助我理解?提前致謝。Mips函數declarion

將mips轉換爲高級語言。

int leaf_example (int g, int h, int i, int j) { 
    int f= (g+h)-(i+j); return f;} 

的Mips代碼:

# g,h,i and j corresponds to $a0-$a3 

    # g,h,i and j corresponds to $a0-$a3 
    # adjust stack for 3 items # save register $t1,$t0 # and $s0 for # use afterwards 
    Sub $sp,$sp,-12 
    sw $t1,8($sp) 
    sw $t0,4($sp) 
    sw $s0,0($sp) 

    # Body of procedure 

    add $t0,$a0,$a1 # $t0=g+h 
    add $t1,$a2,$a3 # $t1=i+j 
    sub $s0,$t0,$t1 # $s0=(g+h)-(i+j) 

# return the value of f, copy into value register 

    add $v0,$s0,$zero #$v0=$s0 


# before returning, we need to restore values 

lw $s0,0($sp) # restore register 
lw $t0,4($sp) # $s0,$t0,$t1 for 
lw $t1,8($sp) # caller. 
add $sp,$sp,12 # release stack 
jr $ra   # jump back to calling routine 

現在我不知道爲什麼我應該做的「#調整棧3項#保存寄存器$ T1,$ T0#和#使用之後S0 $」部分。我可以從程序主體開始而不做嗎?

其次,我爲什麼要做add $v0,$s0,$zero #$v0=$s0?我已經將我的結果插入到$ s0中了?

如果我得到一些答案,我會很感激。

回答

2

這個問題都與MIPS calling procedure有關。

從本質上講,當你在MIPS彙編編寫一個函數,你應該遵循以下約定:

  • 參數都採取了在$a0 - $a4
  • 返回值在$v0返回和$v1
  • $ s變量被保存和恢復(以便它們看起來沒有改變)。

爲了滿足這些要求(第三個),您需要使用堆棧來保存$s變量。所以這是在你的例子中擴展堆棧的目的是保存變量(儘管$t變量通常不被被調用者保存 - 約定規定這些調用者被保存)。