C.LBU

RISC-V C.LBU 指令详解

指令手册C-type

RV32/RV64 Zcb:从 rs1'+0–3 字节偏移加载字节,零扩展到 XLEN 后写入 rd';寄存器均限 x8–x15。

指令语法

c.lbu rd', uimm(rs1')
操作数说明
RV32/RV64,Zcb 1.0.0,依赖 Zca;16 位 CLB 格式。
rd' 与 rs1' 的三位字段均选 x8–x15;uimm 为 0–3 字节,不缩放。
基址加零扩展偏移形成地址;成功加载字节零扩展到 XLEN。字节自然对齐,但仍须满足 EEI 访问条件。
Zcb压缩指令

指令行为说明

C.LBU(Zcb 1.0.0,依赖Zca,CLB)用于RV32/RV64。rd'与rs1'均限x8–x15;基址加零扩展字节偏移0–3形成地址,成功加载字节零扩展到XLEN写rd'。等价lbu rd', uimm(rs1')。字节自然对齐,地址可访问性仍由EEI决定。

C.LBU 压缩编码学习实验

展示 16 位编码、操作数、计算和架构结果。

c.lbu, ()

RV32/RV64, Zcb (requires Zca)

EA = 0x0000000000002000 + 1 = 0x0000000000002001 x9 <- 0x0000000000000080

16 位编码字段

15..10: funct6
100000
9..7: rs1'
010
6: uimm[0]
1
5: uimm[1]
0
4..2: rd'
001
1..0: op
00
rd' = 001 -> x9; rs1' = 010 -> x10
uimm[1:0] = 01; inst[6]=1, inst[5]=0 -> 1 (零扩展,不缩放)
x10 + uimm = 0x0000000000002000 + 1 = 0x0000000000002001
mem[0x0000000000002001][7:0] = 0x80
零扩展字节 = 0x0000000000000080
尚未提交架构状态。

快速理解与检索要点

RV32/RV64 Zcb:从 rs1'+0–3 字节偏移加载字节,零扩展到 XLEN 后写入 rd';寄存器均限 x8–x15。

CLB:funct6=100000,op=00;rs1'=[9:7]、rd'=[4:2];uimm[0]=bit6、uimm[1]=bit5,其余偏移位为零。
Zcb 1.0.0 依赖 Zca;C 本身不包含 Zcb。偏移为 0–3 字节,不缩放。
字节访问始终自然对齐;EEI 决定可访问地址,访问失败不产生已完成的加载结果。

常见使用场景

数据加载

RV32/RV64 Zcb,x10=0x2000、mem[0x2001]=0x80 且访问成功:c.lbu x9, 1(x10) 得到 x9=0x80,高位均为零。

数组与内存访问

RV32/RV64 Zcb,x10=0x2000、mem[0x2001]=0x80 且访问成功:c.lbu x9, 1(x10) 得到 x9=0x80,高位均为零。

使用前检查清单

语法检查
  • RV32/RV64,Zcb 1.0.0,依赖 Zca;16 位 CLB 格式。
  • rd' 与 rs1' 的三位字段均选 x8–x15;uimm 为 0–3 字节,不缩放。
语义检查
  • 基址加零扩展偏移形成地址;成功加载字节零扩展到 XLEN。字节自然对齐,但仍须满足 EEI 访问条件。

容易混淆 / 常见误区

rd'和rs1'仅限x8-x15
偏移量为零扩展,2位无符号偏移,字节粒度

常见问题

0x80 会加载为负数吗?

不会。它是零扩展字节加载;成功加载 0x80 后,RV32 得到 0x00000080,RV64 得到 0x0000000000000080。

偏移可以是负数或需要对齐吗?

偏移是 0–3 的无符号字节值。字节访问自然对齐,但地址是否合法或可访问仍取决于 EEI。