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

MIPS汇编代码运行提示‘程序执行完毕(从底部退出)’求助

MIPS汇编运行报错排查:-- program is finished running (dropped off bottom) --

运行MIPS汇编代码时出现提示-- program is finished running (dropped off bottom) --,说明程序没有通过合法的退出系统调用终止,而是执行到了代码末尾之外的区域。结合你提供的代码,问题出在以下几个核心点:


代码中的错误

  • .data段随意插入.text中间:MIPS要求数据段(.data)和代码段(.text)必须分开定义,不能在代码执行流程中插入.data。你在.text里多次插入prompt、sum、avg的定义,会让汇编器把这些数据当作指令执行,直接打乱程序逻辑。
  • bne指令不完整:代码末尾的bne $缺少两个操作数(要比较的寄存器和跳转目标),属于语法错误,会导致程序执行到这里时异常终止。
  • 错误覆盖数组地址寄存器:循环前执行li $t0, 3,把之前存储数组地址的t0改成了数值3,后续lw $t2, 0($t0)会去访问地址为3的内存,属于非法访问,完全偏离遍历数组的逻辑。
  • 缺少程序退出调用:程序没有执行li $v0, 10 + syscall的退出系统调用,即使前面逻辑正常,也会因为执行到代码末尾触发报错。

修复后的完整代码

.data
array: .space 12          # 为数组预留12字节内存
prompt: .asciiz "Enter three integers: "
sum: .word 0              # 存储总和的变量
avg: .word 0              # 存储平均值的变量

.text
.globl main
main:
    la $t0, array         # 加载数组地址到$t0

    # 打印提示字符串
    li $v0, 4
    la $a0, prompt
    syscall

    # 读取三个整数并存储到数组
    li $v0, 5
    syscall
    sw $v0, 0($t0)

    li $v0, 5
    syscall
    sw $v0, 4($t0)

    li $v0, 5
    syscall
    sw $v0, 8($t0)

    # 计算总和并存储
    lw $t1, 0($t0)
    lw $t2, 4($t0)
    lw $t3, 8($t0)
    add $t4, $t1, $t2
    add $t4, $t4, $t3
    sw $t4, sum

    # 计算平均值并存储
    li $t5, 3
    div $t4, $t5
    mflo $t4
    sw $t4, avg

    # 循环验证总和(修复后的遍历逻辑)
    la $t0, array         # 重新加载数组地址到$t0
    li $t1, 0             # 初始化累加器
    li $t6, 0             # 初始化循环计数器
loop:
    lw $t2, 0($t0)
    add $t1, $t1, $t2
    addi $t0, $t0, 4
    addi $t6, $t6, 1
    bne $t6, 3, loop      # 循环3次后退出

    # 程序正常退出
    li $v0, 10
    syscall

修复说明

  1. 把所有数据定义集中放在开头的.data段,.text只放执行逻辑,严格区分数据和代码区域。
  2. 补全bne指令的操作数,用计数器t6控制循环执行3次,完成数组遍历累加。
  3. 循环前重新加载数组地址到t0,避免覆盖之前的有效地址。
  4. 添加了main入口和最后的退出系统调用,保证程序能正常终止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:55:17