命令セット・アセンブリ

RISC-Vの標準の呼び出し規約では、関数に入るときのスタックポインタspを16バイトの倍数にそろえることになっている。その理由として最も適切なものはどれか。

  1. Aスタックの容量が16バイトの倍数でないと、OSが起動しないから
  2. Bspの下位4ビットに関数の番号を記録するから
  3. C16バイトまでの大きなデータをスタックに置いても、境界をまたがずに効率よく読み書きできるから
答えと解説を見る

正解:C. 16バイトまでの大きなデータをスタックに置いても、境界をまたがずに効率よく読み書きできるから

データは大きさの倍数の番地に置く(整列する)と、境界をまたがずに1回で読み書きできます。spを常に16の倍数にしておけば、8バイトのdoubleや16バイトのlong doubleなどをスタックに置いても整列が保たれます。そのため関数はフレームの大きさを16の倍数で確保し、保存するレジスタが1つでも「addi sp, sp, -16」とします。

  • A. OSの起動とは関係ありません。
  • B. spの下位ビットに情報を入れることはありません。
  • C. 正しい。倍精度や128ビットのデータの整列のためです。
この分野を解く 分野ページへ

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

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