会修改 sp 吗?
不会。x2/sp 是固定源寄存器,结果仅写入 rd';例如 sp=0x1000、偏移16 时 x8=0x1010。
RV32/RV64:将 sp 加 4–1020 的非零四字节倍数偏移,写入 x8–x15 的目标寄存器;sp 不变。
C.ADDI4SPN(C 2.0 / Zca,CIW)固定读取 x2/sp,将4–1020的非零四字节倍数偏移加到旧sp,结果低XLEN位写rd'(x8–x15),sp不变。汇编偏移已是字节,不再乘4;编码为nzuimm[9:2],低两位为零。等价addi rd', x2, nzuimm;零偏移保留。
从 16 位字段出发,连接压缩约束、基础指令语义与最终可见状态。
sp = 0x0000000000001000, offset = 16x8 = 0x0000000000001010RV32C/RV64C / Zca; IALIGN=16
16 位编码与字段职责
可见计算过程
固定 x2 是输入基址,rd' 是唯一写回目标。
编码重组与地址生成
rd' -> x8 (x8-x15)nzuimm[9:2] = 00000100; low bits = 00addi x8, x2, 16x8 <- 0x0000000000001010RV32/RV64:将 sp 加 4–1020 的非零四字节倍数偏移,写入 x8–x15 的目标寄存器;sp 不变。
RV32/RV64,sp=0x1000:c.addi4spn x8, 16 得到 x8=0x1010,sp 不变;16 已是字节偏移。
RV32/RV64,sp=0x1000:c.addi4spn x8, 16 得到 x8=0x1010,sp 不变;16 已是字节偏移。
不会。x2/sp 是固定源寄存器,结果仅写入 rd';例如 sp=0x1000、偏移16 时 x8=0x1010。
不用。16 已是字节偏移;编码存放其 [9:2] 位,硬件还原低两位零。零偏移是保留编码。