咨询RVC指令C.ADDI4SPN中N的含义及相关指令疑问
关于RVC指令集C.ADDI4SPN和C.ADDI16SP的疑问解答
C.ADDI4SPN中"N"的含义
你猜对了,这里的"N"核心指向结果不写回SP,而是写入一个非SP的通用寄存器rd'(具体是压缩指令专属的低8个通用寄存器x8-x15)。这个命名也贴合它的典型用途:通过SP加上4的倍数偏移(立即数低2位为0),计算出栈内某个字的地址,然后把这个地址存到其他寄存器,方便后续直接访问栈内变量——相当于“获取栈中第N个字的地址”的语义,和C.ADDI16SP直接修改SP的行为划清界限。
C.ADDI16SP扩展写法的疑问
手册里写C.ADDI16SP扩展为addi x2, x2, nzimm[9:4],本质是为了明确指令编码的位段对应关系:
- C.ADDI16SP的立即数必须是16的倍数(低4位固定为0),所以它的机器码里只用6位来存储立即数的高6位(对应原立即数的第9到第4位)。标注
nzimm[9:4]就是告诉读者:这个6位编码需要左移4位,才能得到实际要加到SP上的数值(范围-512到496,步长16)。 - 而C.LWSP这类指令的偏移量是4的倍数(对应加载4字节数据的对齐要求),它的编码位段对应偏移量除以4后的值,手册里写
nzimm是简化表述,但本质也是取对应高位后左移。两者写法不同,只是因为各自的立即数步长不同,手册为了明确C.ADDI16SP的编码逻辑,特意标出了具体的位段范围。
内容的提问来源于stack exchange,提问作者h-chal
相关产品推荐
相关产品推荐

