命令セット・アセンブリ

RISC-Vで、12ビットの即値に収まらない32ビットの定数(例: 0x12345678)をレジスタに入れる一般的な方法はどれか。

  1. Aaddiを1回使い、32ビットの即値をそのまま書く
  2. Bluiで上位20ビットを設定し、addiで下位12ビットを足す
  3. C定数は使えないので、必ず入力から読み込む
答えと解説を見る

正解:B. luiで上位20ビットを設定し、addiで下位12ビットを足す

lui(load upper immediate)は、20ビットの即値をレジスタのビット31〜12に置き、下位12ビットを0にします。続けてaddiで下位12ビットを足せば、任意の32ビットの定数ができます。アセンブリで「li a0, 0x12345678」と書くと、アセンブラが必要に応じてこの2命令に展開します。命令の長さを固定にしたISAでは、大きな定数を分けて作るのが一般的です。

  • A. 32ビットの命令に32ビットの即値は入りません。
  • B. 正しい。疑似命令liもこの組み合わせに展開されます。
  • C. 2命令で作れますし、メモリに置いて読むこともできます。
この分野を解く 分野ページへ

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

  1. RISC-Vで定数0x12345FFFをluiとaddiの2命令で作るとき、正しい組み合わせはどれか。
  2. RISC-Vのauipc命令(add upper immediate to PC)の動作として正しいものはどれか。
  3. RISC-V(RV32I)で「addi t0, zero, -1」を実行した後、t0に入っている32ビットの値はどれか。
  4. メモリ上の1バイトに0x80が入っている。RISC-Vのlb命令とlbu命令でこのバイトを32ビットのレジスタに読み込んだときの値の組み合わせとして正しいものはどれか。
  5. 条件分岐のしくみについて、RISC-Vとx86の違いとして正しいものはどれか。