递归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
相关产品推荐
相关产品推荐

