You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

验证步骤

  1. 替换所有jal x0, target为j target,解决模拟器挂起问题;
  2. 替换乘法函数为幂函数,修正多位数转换的逻辑错误;
  3. 重新运行程序,测试多位数输入(如123)是否能正确转换为寄存器值。

内容的提问来源于stack exchange,提问作者Pedro Henrique Andrade da Silv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:16:14