命令セット・アセンブリ

RISC-Vの関数の先頭で「addi sp, sp, -16」を実行する目的として正しいものはどれか。

  1. Aスタックを番地の小さい方へ伸ばして、16バイトの作業領域を確保する
  2. Bスタック上の16バイトを解放する
  3. Cspに入っている値から16を引いて、戻り値として返す
答えと解説を見る

正解:A. スタックを番地の小さい方へ伸ばして、16バイトの作業領域を確保する

RISC-Vを含む多くのISAの慣習では、スタックは番地の大きい方から小さい方へ伸びます。spを16減らすと、新しいspから元のspまでの16バイトが、この関数のスタックフレームになり、戻り先や保存したレジスタ、局所変数を置けます。関数の終わりに「addi sp, sp, 16」でspを戻すと領域が解放され、呼ぶ前と同じ状態になります。

  • A. 正しい。スタックは番地の小さい方へ伸びます。
  • B. 解放は最後の「addi sp, sp, 16」です。
  • C. 戻り値はa0で返します。
この分野を解く 分野ページへ

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

  1. RISC-Vの標準の呼び出し規約では、関数に入るときのスタックポインタspを16バイトの倍数にそろえることになっている。その理由として最も適切なものはどれか。
  2. 上のコードは、ある関数の先頭(プロローグ)である。この部分が行っていることとして正しいものはどれか。
  3. 関数の中でフレームポインタ(RISC-Vではs0/fp)を使う利点として正しいものはどれか。
  4. RISC-Vで、自分自身を呼び出す再帰関数を書くときに、raをスタックに保存し忘れるとどうなるか。
  5. リトルエンディアンのRISC-Vで、0x12345678の入ったレジスタを「sw」で番地0x100に書き込んだ。その後「lbu」で番地0x101の1バイトを読むと、値はいくらか。