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

MIPS32使用栈实现递归乘法无输出问题排查

MIPS递归乘法代码问题排查与修复

核心问题列表

  • 未正确调用递归函数:输入获取完成后没有使用jal mult触发递归调用,直接顺次进入mult标签执行,递归结束后jr $ra无法正确回到main函数的输出逻辑,导致程序跑飞无输出
  • 递归终止条件逻辑错误:当前判断$a0(被乘数) == 1作为终止条件,不符合重复加法累加逻辑,应该判断$a1(乘数) == 1作为终止边界,乘数代表被乘数的累加次数
  • 终止态返回值未初始化:终止分支中add $v0, $v0, 0使用了未初始化的$v0原值(此时$v0是之前读取输入的系统调用号5,值错误),终止时乘积直接等于被乘数,应该赋值move $v0, $a0
  • 栈保存逻辑缺失:递归过程中修改了$a1寄存器,但未将$a1入栈保存,递归返回后上层的$a1值会被破坏
  • 输出逻辑完全错误:计算完成的结果存储在$v0寄存器中,现有输出逻辑错误读取未赋值的multiplicand内存空间,且指令顺序错误覆盖了读取值,最终输出内容不符合预期

修复后可运行代码

.text
main:
  # 保存main的返回地址,防止调用递归后丢失
  addiu $sp, $sp, -4
  sw $ra, 0($sp)

  # 打印第一个提示,输入被乘数
  li $v0, 4
  la $a0, prompt1
  syscall
  # 读取被乘数存入$a0
  li $v0, 5
  syscall
  move $a0, $v0
  
  # 打印第二个提示,输入乘数
  li $v0, 4
  la $a0, prompt2
  syscall
  # 读取乘数存入$a1
  li $v0, 5
  syscall
  move $a1, $v0
  
  # 正确调用递归乘法函数
  jal mult

  # 输出计算结果
  move $a0, $v0
  li $v0, 1
  syscall
  
  # 恢复栈,结束程序
  lw $ra, 0($sp)
  addiu $sp, $sp, 4
  li $v0, 10
  syscall

# 递归乘法函数:$a0=被乘数,$a1=乘数,$v0=乘积
mult:
  addiu $sp,$sp, -12 # 栈空间存$ra、$a0、$a1三个寄存器
  sw $ra, 0($sp)
  sw $a0, 4($sp)
  sw $a1, 8($sp)

  # 终止条件:乘数为1时,返回被乘数本身
  bne $a1, 1, else
  move $v0, $a0
  j mult_exit
else: 
  # 乘数减1,递归调用
  sub $a1, $a1, 1
  jal mult
  # 递归返回后,累加本次的被乘数到结果
  lw $a0, 4($sp)
  add $v0, $v0, $a0
mult_exit: 
  # 恢复栈寄存器,返回
  lw $ra, 0($sp)
  lw $a0, 4($sp)
  lw $a1, 8($sp)
  addiu $sp, $sp, 12
  jr $ra

.data
prompt1: .asciiz "Enter the multiplicand: "
prompt2: .asciiz "Enter the multiplier: "

测试验证

输入被乘数7、乘数9,程序会输出正确结果63。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:06:04