命令セット・アセンブリ

RISC-Vの標準の呼び出し規約で、整数の引数が10個ある関数を呼ぶとき、9個目と10個目の引数はどこで渡されるか。

  1. As0とs1
  2. Bt0とt1
  3. Cスタック上
答えと解説を見る

正解:C. スタック上

引数用のレジスタはa0〜a7の8本なので、9個目以降は呼び出す側がスタックに積み、呼ばれた側はスタックポインタからの決まった位置で読みます。メモリへのアクセスが増えるので、引数がとても多い関数は少し遅くなります。大きな構造体はまとめて構造体へのポインタで渡すなど、引数を少なくする工夫がよく使われます。

  • A. s0〜は呼ばれた側が保存するレジスタで、引数用ではありません。
  • B. t0〜は一時用のレジスタで、引数用ではありません。
  • C. 正しい。レジスタに入りきらない分はスタックです。
この分野を解く 分野ページへ

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

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