MIPS实现1到n求和代码无输出问题排查及修正
1到n累加和的MIPS代码修复与问题解析
需求
实现计算1到n的累加和,在控制台输出迭代法与递归法的计算结果,但原MIPS代码执行后无法看到求和结果,需修正代码并说明问题。
原代码问题分析
- 数据段语法错误:
integer字符串的.asciiz定义缺少闭合双引号,导致字符串解析异常,后续打印系统调用执行失败。 - 递归函数缺陷:
- 未保存返回地址寄存器
$ra,递归调用时$ra被覆盖,函数无法正确返回主程序。 - 求和逻辑错误:累加时使用
n-1而非原输入的n,导致结果计算错误。
- 未保存返回地址寄存器
修正后的MIPS代码
.data integer: .asciiz "\nEnter a positive integer: " result_1: .asciiz "(Iterative)Sum from 1 to n: " result_2: .asciiz "\n(Recursive)Sum from 1 to n: " newline: .asciiz "\n" .text main: # 打印提示并读取正整数 li $v0, 4 la $a0, integer syscall read_input: li $v0, 5 syscall move $t0, $v0 # 将n存入$t0 # 迭代计算累加和 li $t1, 0 # 初始化累加和为0 li $t2, 1 # 初始化计数器为1 loop_iterative: add $t1, $t1, $t2 # 将计数器值加到累加和 addi $t2, $t2, 1 # 计数器自增1 # 判断计数器是否小于等于n ble $t2, $t0, loop_iterative # 调用递归函数计算累加和 move $a0, $t0 jal calculate_sum move $t3, $v0 # 保存递归调用结果 # 打印换行 li $v0, 4 la $a0, newline syscall # 打印迭代结果 li $v0, 4 la $a0, result_1 syscall move $a0, $t1 li $v0, 1 syscall # 打印递归结果 li $v0, 4 la $a0, result_2 syscall move $a0, $t3 # 使用递归调用的结果 li $v0, 1 syscall # 打印换行 li $v0, 4 la $a0, newline syscall # 退出程序 li $v0, 10 syscall calculate_sum: # 递归求和函数 # 输入: $a0 - n # 输出: $v0 - 累加和 # 保存寄存器到栈 addi $sp, $sp, -8 sw $ra, 4($sp) sw $a0, 0($sp) # 基准情况:n <= 1时返回1 blez $a0, calculate_sum_base # 递归情况:调用calculate_sum(n-1) addi $a0, $a0, -1 jal calculate_sum # 将原n加到递归结果上 lw $a0, 0($sp) add $v0, $v0, $a0 # 恢复寄存器 lw $ra, 4($sp) addi $sp, $sp, 8 jr $ra calculate_sum_base: li $v0, 1 # 恢复寄存器 lw $ra, 4($sp) lw $a0, 0($sp) addi $sp, $sp, 8 jr $ra
修正说明
- 补全
integer字符串的闭合双引号,修复数据段语法错误,确保打印系统调用正常执行。 - 在递归函数中通过栈保存
$ra和$a0,避免递归调用时寄存器被覆盖,保证函数能正确返回主程序。 - 修正递归求和逻辑,将原输入的
n与递归调用结果相加,得到正确的1到n累加和。
内容的提问来源于stack exchange,提问作者user22742077
相关产品推荐
相关产品推荐

