命令セット・アセンブリ
RISC-Vの呼び出し規約で、t0〜t6は「呼び出し元保存(caller-saved)」のレジスタである。ある関数がt0に入れた値を、別の関数を呼んだ後も使いたいとき、正しい対応はどれか。
- A何もしなくても、呼ばれた関数がt0を必ず元に戻してくれる
- Bt0はほかの関数から書き換えられないので、そのまま使える
- C呼ぶ前にt0の値をスタックなどに退避し、呼んだ後に戻す
答えと解説を見る
正解:C. 呼ぶ前にt0の値をスタックなどに退避し、呼んだ後に戻す
t系のレジスタは、呼ばれた関数が保存せずに自由に使ってよいことになっています。そのため、呼んだ後も値が必要なら、呼ぶ側が自分で退避しておく必要があります。保存の責任を、呼ぶ側と呼ばれる側でレジスタごとに分けておくと、多くの関数は保存の手間なく一時用のレジスタを使え、全体の保存と復元の回数を減らせます。
- A. t系は呼ばれた側が自由に壊してよいレジスタです。
- B. どの関数もt0を自由に使えます。
- C. 正しい。または最初から保存されるsレジスタに置きます。