命令セット・アセンブリ

RISC-Vの呼び出し規約で、s0〜s11が「呼び出し先保存(callee-saved)」のレジスタとされている意味として正しいものはどれか。

  1. A呼ばれた関数がこれらを使うなら、元の値を保存しておき、戻る前に元に戻す
  2. B呼ぶ側の関数が、呼ぶ前に必ずすべて0にしておく
  3. COSだけが使えるレジスタで、ユーザのプログラムは使えない
答えと解説を見る

正解:A. 呼ばれた関数がこれらを使うなら、元の値を保存しておき、戻る前に元に戻す

呼び出し先保存のレジスタは、関数呼び出しをまたいで値が保たれることが約束されています。呼ばれた関数がs0などを使いたいときは、最初にスタックへ保存し、戻る前に元に戻します。呼ぶ側は、関数を呼んだ後も使い続けたい値をs系のレジスタに置いておけば、自分で保存し直す必要がありません。ループの変数などがよくここに置かれます。

  • A. 正しい。呼ぶ側からは値が保たれて見えます。
  • B. 0にする決まりはありません。
  • C. ユーザのプログラムも普通に使えます。
この分野を解く 分野ページへ

命令セット・アセンブリのほかの問題

  1. RISC-Vの呼び出し規約で、t0〜t6は「呼び出し元保存(caller-saved)」のレジスタである。ある関数がt0に入れた値を、別の関数を呼んだ後も使いたいとき、正しい対応はどれか。
  2. ほかの関数を呼ばない関数(葉関数、リーフ関数)では、raをスタックに保存しなくてよい場合が多い。その理由として正しいものはどれか。
  3. RISC-Vの関数の先頭で「addi sp, sp, -16」を実行する目的として正しいものはどれか。
  4. RISC-Vの標準の呼び出し規約では、関数に入るときのスタックポインタspを16バイトの倍数にそろえることになっている。その理由として最も適切なものはどれか。
  5. 上のコードは、ある関数の先頭(プロローグ)である。この部分が行っていることとして正しいものはどれか。