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
修复说明
- 把所有数据定义集中放在开头的
.data段,.text只放执行逻辑,严格区分数据和代码区域。 - 补全
bne指令的操作数,用计数器t6控制循环执行3次,完成数组遍历累加。 - 循环前重新加载数组地址到
t0,避免覆盖之前的有效地址。 - 添加了
main入口和最后的退出系统调用,保证程序能正常终止。
内容的提问来源于stack exchange,提问作者i6xxe
相关产品推荐
相关产品推荐

