如何在RISC-V中存储大于4095的数值?遇操作数超出范围报错
问题原因与解决办法
为什么会报错?
RISC-V的addi指令的立即数是12位有符号整数,有效范围是-2048到2047。你要加载的10000远超出这个范围,所以汇编器直接报错。
你遇到的不同数值的报错逻辑:
- 1-2047:正好落在12位有符号数的正区间内,正常执行
- 2048-4095:这些数属于12位无符号数范围,但
addi会对立即数做符号扩展,它们会被解析为负数(比如2048的二进制是100000000000,符号扩展后是32位负数),所以汇编器提示“Unsigned value is too large to fit into a sign-extended immediate” - 大于4095:连12位无符号数的范围都超了,直接触发操作数超出范围的报错
解决办法
方法1:用li伪指令(推荐)
汇编器提供的li(load immediate)伪指令会自动处理大数值,生成合适的指令组合,不用手动拆分:
li t1, 10000
方法2:手动用lui+addi组合
如果要手动实现,先通过lui加载数值的高20位,再用addi补充低12位:
lui t1, 0x2 # 加载0x20000(10000的高20位) addi t1, t1, 0x100 # 加上0x100,得到0x20100 = 10000
内容的提问来源于stack exchange,提问作者cartwg
相关产品推荐
相关产品推荐

