命令セット・アセンブリ
RISC-Vで、12ビットの即値に収まらない32ビットの定数(例: 0x12345678)をレジスタに入れる一般的な方法はどれか。
- Aaddiを1回使い、32ビットの即値をそのまま書く
- Bluiで上位20ビットを設定し、addiで下位12ビットを足す
- 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命令で作れますし、メモリに置いて読むこともできます。