0

皆さん、こんにちは。Mips を始めたばかりで、手順 (関数の宣言) を取得しましたが、その一部が理解できませんでした。理解を助ける人はいますか? 前もって感謝します。

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 に既に挿入しましたか?

いくつかの答えが得られれば、私はとてもうれしいです。

4

1 に答える 1

2

この質問はすべて、MIPS 呼び出し手順に関係しています。

基本的に、MIPS アセンブリで関数を記述する場合は、次の規則に従う必要があります。

  • 引数は$a0-$a4
  • 戻り値は$v0およびで返されます$v1
  • $s 変数は保存および復元されます (変更されていないように見えます)。

これらのポイント (3 番目) を満たすには、スタックを使用して$s変数を保存する必要があります。したがって、これは、例でスタックを拡張する目的は、変数を保存することです ($t変数は通常、呼び出し先によって保存されませんが、規則では、これらは呼び出し元が保存されることが規定されています)。

于 2013-10-28T19:19:49.903 に答える