RISC-V加载负数异常:存入-2999到s7寄存器得到1097求助
问题原因与解决方案
核心问题:addi指令的立即数范围限制
RISC-V的addi指令使用12位有符号立即数,能表示的数值范围是 -2048(即 -2^11)到 2047(即 2^11-1)。你要加载的-2999明显超出了这个范围,汇编器会自动对立即数进行12位截断处理——只保留数值的低12位补码,最终导致寄存器里的值变成了1097。
数值截断的计算逻辑
对于超出12位范围的数,实际传入addi的是该数模4096(2^12)的结果:
-2999 + 4096 = 1097
这就是为什么你看到寄存器里是1097的原因。
正确加载大数值的方法
要加载超出12位范围的数值,需要结合lui(加载高位立即数)和addi指令,分别处理32位数值的高20位和低12位:
# 加载-2999到s7寄存器 lui s7, %hi(-2999) # 加载-2999的高20位到s7的高位部分 addi s7, s7, %lo(-2999) # 补充-2999的低12位,完成完整数值的加载
如果不想用伪指令%hi/%lo,也可以手动计算对应位段的数值:
-2999的32位补码是11111111111111111110100100000111- 高20位对应十进制
-2,低12位对应十进制2311
因此代码也可以写成:
lui s7, -2 addi s7, s7, 2311
内容的提问来源于stack exchange,提问作者Savage's Project
相关产品推荐
相关产品推荐

