lui
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
一个完整的常量需要两条指令。lui 设置高 20 位,addi 加上低 12 位。li 伪指令会为你完成这项工作,因此对于普通数值,很少需要手写 lui。
RISC-V 手册指出,lui 和 auipc 的汇编语法省略常量的低 12 位,因为这些位始终为零。它还指出,lui 后接 jalr 可以到达任意 32 位绝对地址:lui 加载目标地址的高 20 位,jalr 加上低位。
当加载低位为零的整地址(例如硬件设备的固定地址)时,lui 会直接出现,此时单条 lui 就能提供整个值。它的近亲是 auipc,它构建相对于当前位置的地址。
示例
lui t0, 0x10 # t0 = 0x10000 (0x10 << 12)
