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

MIPS实现1到n求和代码无输出问题排查及修正

1到n累加和的MIPS代码修复与问题解析

需求

实现计算1到n的累加和,在控制台输出迭代法与递归法的计算结果,但原MIPS代码执行后无法看到求和结果,需修正代码并说明问题。

原代码问题分析

  1. 数据段语法错误:integer字符串的.asciiz定义缺少闭合双引号,导致字符串解析异常,后续打印系统调用执行失败。
  2. 递归函数缺陷:
    • 未保存返回地址寄存器$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

修正说明

  1. 补全integer字符串的闭合双引号,修复数据段语法错误,确保打印系统调用正常执行。
  2. 在递归函数中通过栈保存$ra和$a0,避免递归调用时寄存器被覆盖,保证函数能正确返回主程序。
  3. 修正递归求和逻辑,将原输入的n与递归调用结果相加,得到正确的1到n累加和。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:37