命令セット・アセンブリ

RISC-Vで、自分自身を呼び出す再帰関数を書くときに、raをスタックに保存し忘れるとどうなるか。

  1. A内側の呼び出しでraが上書きされ、外側の関数が正しい呼び出し元へ戻れなくなる
  2. BCPUが自動でraを保存するので、何も問題は起きない
  3. C再帰の深さに関係なく、計算結果が2倍になる
答えと解説を見る

正解:A. 内側の呼び出しでraが上書きされ、外側の関数が正しい呼び出し元へ戻れなくなる

再帰呼び出しのjalは、raを「自分の中の呼び出しの次の命令」で上書きします。保存していないと、外側の関数がretしたとき元の呼び出し元ではなく自分の中へ戻ってしまい、同じ場所を繰り返したり誤動作したりします。そのため、ほかの関数を呼ぶ関数は、プロローグでraをスタックに保存し、エピローグで戻すのが決まりです。

  • A. 正しい。自分の中のjal直後に戻り続けてしまいます。
  • B. RISC-Vのjalはraを書き換えるだけです。
  • C. 結果が決まった倍数になるわけではありません。
この分野を解く 分野ページへ

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

  1. リトルエンディアンのRISC-Vで、0x12345678の入ったレジスタを「sw」で番地0x100に書き込んだ。その後「lbu」で番地0x101の1バイトを読むと、値はいくらか。
  2. RISC-Vで4バイトを読むlw命令の番地が4の倍数でない(境界がそろっていない)とき、起こりうることとして正しいものはどれか。
  3. RISC-Vの命令「slli t0, a0, 3」の結果t0は、a0の値の何倍になるか(あふれは考えない)。
  4. a0にint型(4バイト)の配列aの先頭番地、a1に添字iが入っている。上のコードがa2に読み込むものとして正しいものはどれか。
  5. x86の命令「add eax, [rbx]」のように、演算命令がメモリ上の値を直接使える方式について正しいものはどれか。