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

递归RISC-V汇编程序返回值与输入相同的问题求助

递归累加42 n次的汇编程序错误修复

问题说明

需要实现一个递归汇编程序,将数字42累加n次(输入值为n),但当前程序输入任意值时,返回结果与输入值相同(如输入5输出5),无法得到正确的累加结果。

错误原因

问题出在递归返回后的栈恢复步骤:
在递归调用完成并计算出a0 = 递归结果 + 42之后,代码中执行了ld a0, 0(sp),这会把栈中保存的原始输入n重新加载到a0寄存器,直接覆盖了之前计算好的累加结果,最终返回的是原始n而非正确的累加值。这行代码属于多余操作,递归逻辑已经不需要用到原始n,完全可以移除。

修复后的汇编代码

.text
    .globl meaning_of_life
    .type meaning_of_life, @function
meaning_of_life:
    addi sp, sp, -16     # 分配栈帧空间
    sd ra, 8(sp)         # 保存返回地址
    sd a0, 0(sp)         # 保存原始n(后续逻辑不需要,但保留也不影响)

    li t0, 42            # 将42加载到临时寄存器t0
    beqz a0, base_case   # 如果n为0,跳转到基准情况

    addi a0, a0, -1      # n自减1
    call meaning_of_life # 递归调用

    add a0, a0, t0       # 将递归结果加上42,得到当前n的累加值

    ld ra, 8(sp)         # 恢复返回地址
    # 移除了错误的ld a0, 0(sp)语句,不再覆盖计算结果
    addi sp, sp, 16      # 释放栈帧空间
    ret                  # 返回结果

base_case:
    li a0, 0             # 基准情况:累加0次结果为0
    ld ra, 8(sp)         # 恢复返回地址
    addi sp, sp, 16      # 释放栈帧空间
    ret                  # 返回基准结果

验证说明

修复后程序递归逻辑恢复正常:

  • 输入n=5时,递归会依次计算n=4、3、2、1、0的累加结果,最终返回42*5=210,符合预期。
  • 配套的C调用代码无需修改,保持原逻辑即可正常运行。

内容的提问来源于stack exchange,提问作者Chris Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:14:59