C.LH 与 C.LHU 有什么区别?
同样从基址加0或2字节读取16位值。C.LH 符号扩展,C.LHU 零扩展;0x8001 在 RV64 分别得到0xffffffffffff8001与0x8001。
RV32/RV64 Zcb 的16位半字加载:偏移0或2字节,加载16位值后符号扩展到XLEN。
C.LH (Zcb, CLH格式)从rs1'加零扩展偏移加载一个半字到rd',结果符号扩展到XLEN位。rd'和rs1'仅限x8-x15。展开为lh rd',uimm(rs1')。偏移为1位无符号×2。属于Zcb,依赖Zca。
只展示官方定义的 16 位字段、地址/立即数计算和架构状态;不模拟流水线、缓存、端序实现或时序。
RV32 / RV64 Zcb (requires Zca)
有效地址为 2 的倍数时自然对齐,地址未对齐选项不适用;访问错误仍可发生。未对齐访问能否完成由 EEI 定义。内存值已按 EEI 端序解释。
RV32/RV64 Zcb 的16位半字加载:偏移0或2字节,加载16位值后符号扩展到XLEN。
RV64 Zcb,x10=0x2000、mem16[0x2002] = 0x8001 且访问成功:c.lh x9, 2(x10) 得到 x9 = 0xffffffffffff8001;RV32 得到0xffff8001。
同样从基址加0或2字节读取16位值。C.LH 符号扩展,C.LHU 零扩展;0x8001 在 RV64 分别得到0xffffffffffff8001与0x8001。
不保证。基址可能为奇数,使有效地址未对齐;即使自然对齐,访问仍须满足 EEI 的内存区域和权限规则。