命令セット・アセンブリ

関数の中でフレームポインタ(RISC-Vではs0/fp)を使う利点として正しいものはどれか。

  1. Aレジスタを1本余分に使わずに済むので、性能が必ず上がる
  2. B関数の途中でspが動いても、局所変数や引数を固定の距離で指定でき、デバッガも呼び出しの連なりをたどりやすい
  3. Cスタックの領域が自動で大きくなり、あふれなくなる
答えと解説を見る

正解:B. 関数の途中でspが動いても、局所変数や引数を固定の距離で指定でき、デバッガも呼び出しの連なりをたどりやすい

フレームポインタは、関数に入った時点のスタックの位置を指したまま動かないレジスタです。可変長の配列などでspが途中で変わっても、局所変数を「fpから何バイト」で指定できます。また、各フレームに前のfpを保存しておけば、たどることで呼び出しの連なり(バックトレース)を得られます。ただしレジスタを1本占めるので、最適化では省略されることも多いです。

  • A. 逆に1本のレジスタを専用に使うことになります。
  • B. 正しい。フレームの基準点として働きます。
  • C. スタックのあふれを防ぐ働きはありません。
この分野を解く 分野ページへ

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

  1. RISC-Vで、自分自身を呼び出す再帰関数を書くときに、raをスタックに保存し忘れるとどうなるか。
  2. リトルエンディアンのRISC-Vで、0x12345678の入ったレジスタを「sw」で番地0x100に書き込んだ。その後「lbu」で番地0x101の1バイトを読むと、値はいくらか。
  3. RISC-Vで4バイトを読むlw命令の番地が4の倍数でない(境界がそろっていない)とき、起こりうることとして正しいものはどれか。
  4. RISC-Vの命令「slli t0, a0, 3」の結果t0は、a0の値の何倍になるか(あふれは考えない)。
  5. a0にint型(4バイト)の配列aの先頭番地、a1に添字iが入っている。上のコードがa2に読み込むものとして正しいものはどれか。