首页/指令库/C-ADDI4SPN
C.ADDI4SPN

RISC-V C.ADDI4SPN 指令详解

指令手册C-type

将零扩展非零立即数(缩放4)加到sp,结果写入rd'。CIW格式。

指令语法

c.addi4spn rd', nzuimm
操作数说明
压缩指令仅 16 位,寄存器选择通常限制在 x8–x15。
立即数字段较窄,查看特定压缩指令的完整编码。
C压缩指令

指令行为说明

C.ADDI4SPN (CIW格式)将零扩展非零立即数(乘以4)加到sp(x2),结果写入rd'(仅x8-x15)。展开为addi rd',x2,nzuimm[9:2]。仅nzuimm≠0时有效。用于生成栈变量指针。

C.ADDI4SPN 压缩编码学习实验

从 16 位字段出发,连接压缩约束、基础指令语义与最终可见状态。

c.addi4spn,
输入
sp = 0x0000000000001000, offset = 16
结果
x8 = 0x0000000000001010

16 位编码与字段职责

15..13
000
funct3
12..11
01
nzuimm[5:4]
10..7
0000
nzuimm[9:6]
6 / 5
0 / 0
[2] / [3]
4..2
000
rd' -> x8
1..0
00
C0

可见计算过程

sp / x2
0x0000000000001000
+
nzuimm
16 (0x0000000000000010)
=
x8
0x0000000000001010

固定 x2 是输入基址,rd' 是唯一写回目标。

编码重组与地址生成

压缩寄存器映射
rd' -> x8 (x8-x15)
散布立即数
nzuimm[9:2] = 00000100; low bits = 00
基础语义对照
addi x8, x2, 16
提交
x8 <- 0x0000000000001010
尚未提交架构状态。

快速理解与检索要点

C.ADDI4SPN 是 压缩 sp 非零立即数加法 的 16 位编码形式;语义和可编码寄存器/立即数范围必须按官方 C 扩展规则理解。

压缩指令常限制可用寄存器集合、立即数编码或目标寄存器;非法组合可能是 reserved。
页面示例只展示汇编意图;实际编码限制以官方 C/Zc 表格为准。

常见使用场景

栈分配对象的指针生成

结合 «c.addi4spn x8, 16 # x8 = sp+16» 等实际代码理解该场景。

压缩代码中的地址计算

结合 «c.addi4spn x8, 16 # x8 = sp+16» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认压缩指令 16 位编码只在支持 C 扩展的 CPU 上可用。
  • 确认 rd/rs1'/rs2' 字段映射到 x8–x15。
语义检查
  • 注意压缩指令的操作数空间有限。
  • 确认这条压缩指令有对应的 32 位展开形式。

容易混淆 / 常见误区

立即数必须非零且为 4 的倍数(4-1020)
目标寄存器仅x8-x15

常见问题

它一定等价于同名 32 位指令吗?

不一定。有些 C/Zc 指令是常见 32 位指令的压缩形式,有些有专门的栈帧或查表语义。

为什么要关注寄存器限制?

许多 16 位编码只能表示压缩寄存器子集或固定寄存器,如 sp、ra、a0/a1。