lui

lui

RISC-V アセンブリ 参考

lyszt.netはluiおよびその他のRISC-V命令をより詳しく扱っています。

エンコーディング形式

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

説明

lui は大きな定数を組み立てます。RISC-V 命令は 32 ビットを占め、それらのビットは演算、そのレジスタ、および任意の定数を運びます。通常の命令はおよそ 12 ビットの定数を保持でき、これは小さな数値をカバーしますが、完全な 32 ビット値には及びません。いくつかの命令が大きな定数の断片を供給します。

lui(load upper immediate)は上位の断片を供給します。これは 20 ビットの定数を取り、それを宛先レジスタの上位 20 ビットに書き込み、下位 12 ビットはゼロのままにします。その形式を以下に示します。

lui rd, value

完全な定数には 2 つの命令が必要です。lui が上位 20 ビットを設定し、addi が下位 12 ビットを加算します。li 疑似命令がこの作業を代行するため、通常の数値に対して手書きの lui が必要になることはほとんどありません。

RISC-V マニュアルには、lui と auipc のアセンブリ構文は定数の下位 12 ビットを省略すると記載されています。これはそれらのビットが常にゼロであるためです。また、lui の後に jalr を続けると任意の 32 ビット絶対アドレスに到達できるとも記載されています。lui が対象アドレスの上位 20 ビットをロードし、jalr が下位ビットを加算します。

lui は、下位ビットがゼロである丸められたアドレス、たとえばハードウェアデバイスの固定アドレスをロードするときに直接現れ、そこでは 1 つの lui が値全体を供給します。その近縁は auipc であり、現在位置を基準としたアドレスを構築します。

例

lui t0, 0x10     # t0 = 0x10000 (0x10 << 12)