命令セット・アセンブリ
RISC-Vで、自分自身を呼び出す再帰関数を書くときに、raをスタックに保存し忘れるとどうなるか。
- A内側の呼び出しでraが上書きされ、外側の関数が正しい呼び出し元へ戻れなくなる
- BCPUが自動でraを保存するので、何も問題は起きない
- C再帰の深さに関係なく、計算結果が2倍になる
答えと解説を見る
正解:A. 内側の呼び出しでraが上書きされ、外側の関数が正しい呼び出し元へ戻れなくなる
再帰呼び出しのjalは、raを「自分の中の呼び出しの次の命令」で上書きします。保存していないと、外側の関数がretしたとき元の呼び出し元ではなく自分の中へ戻ってしまい、同じ場所を繰り返したり誤動作したりします。そのため、ほかの関数を呼ぶ関数は、プロローグでraをスタックに保存し、エピローグで戻すのが決まりです。
- A. 正しい。自分の中のjal直後に戻り続けてしまいます。
- B. RISC-Vのjalはraを書き換えるだけです。
- C. 結果が決まった倍数になるわけではありません。