命令セット・アセンブリ

RISC-Vの疑似命令「ret」は、実際にはどの命令として実行されるか。

  1. Ajal ra, 0
  2. Bjalr x0, 0(ra)
  3. Clw ra, 0(sp)
答えと解説を見る

正解:B. jalr x0, 0(ra)

jalr(jump and link register)は、レジスタの値にオフセットを足した番地へジャンプし、次の命令の番地を書き込み先に入れます。retは「jalr x0, 0(ra)」で、raの番地へ飛び、リンクはx0に捨てます。jalrは関数ポインタや仮想関数の呼び出しのように、行き先が実行時に決まるジャンプにも使われます。raを復元する「lw ra, …」はretの前に行う準備です。

  • A. raを上書きしてしまい、戻れません。
  • B. 正しい。raの番地へ飛び、戻り先は捨てます。
  • C. raをメモリから読むだけで、戻りません。
この分野を解く 分野ページへ

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

  1. 呼び出し規約(コーリングコンベンション)が決められている主な目的はどれか。
  2. RISC-Vの標準の呼び出し規約で、整数の引数と戻り値の受け渡しに使うレジスタとして正しいものはどれか。
  3. RISC-Vの標準の呼び出し規約で、整数の引数が10個ある関数を呼ぶとき、9個目と10個目の引数はどこで渡されるか。
  4. RISC-Vの呼び出し規約で、s0〜s11が「呼び出し先保存(callee-saved)」のレジスタとされている意味として正しいものはどれか。
  5. RISC-Vの呼び出し規約で、t0〜t6は「呼び出し元保存(caller-saved)」のレジスタである。ある関数がt0に入れた値を、別の関数を呼んだ後も使いたいとき、正しい対応はどれか。