RISC-V 32I模拟器CompSim中jal指令导致程序挂起求助
问题分析与解决
挂起问题的直接解决
你遇到的挂起问题大概率是CompSim模拟器对jal x0, l2指令的处理存在兼容性问题。在RISC-V指令集中,jal x0, target和j target是完全等价的(目标寄存器为x0时不会保存返回地址),但部分模拟器对jal x0的跳转逻辑处理有bug。
解决方案:将循环中的jal x0, l2替换为RISC-V原生的无条件跳转指令j l2:
# 替换前 jal x0, l2 # Repeat the loop # 替换后 j l2 # Repeat the loop
同理,input循环中的jal x0, input也建议替换为j input,避免潜在的模拟器兼容性问题。
额外程序逻辑错误(非挂起原因,但影响功能)
你的程序存在核心逻辑错误:mult函数实现的是乘法(计算x10 * x11),但你需要的是计算10^x28(10的x28次方),这会导致多位数转换结果完全错误。
修正幂函数逻辑
重新实现幂函数(命名为power)来计算base^exponent:
power: addi sp, sp, -8 sw x1, 4(sp) sw x5, 0(sp) add x10, x0, 1 # 初始结果为1(任何数的0次方为1) add x5, x0, x11 # x5保存当前指数 power_loop: beq x5, x0, power_exit mul x10, x10, x12 # x10 = x10 * x12(x12为底数,如10) addi x5, x5, -1 j power_loop power_exit: lw x5, 0(sp) lw x1, 4(sp) addi sp, sp, 8 jalr x0, 0(x1)
调用时传递底数到x12、指数到x11:
# 替换原l2循环中的乘法调用 addi x10, x0, 10 # x10 = 10(结果初始值) add x12, x0, x10 # x12 = 10(底数) add x11, x0, x28 # x11 = x28(指数) jal x1, power # 计算10^x28,结果存在x10
验证步骤
- 替换所有
jal x0, target为j target,解决模拟器挂起问题; - 替换乘法函数为幂函数,修正多位数转换的逻辑错误;
- 重新运行程序,测试多位数输入(如
123)是否能正确转换为寄存器值。
内容的提问来源于stack exchange,提问作者Pedro Henrique Andrade da Silv
相关产品推荐
相关产品推荐

