MIPS程序无法终止求助:调用函数后无限循环原因排查
问题原因分析
你的代码出现无限运行的核心原因是main函数执行完jal f并从f返回后,没有终止程序的指令,具体细节如下:
- 当
jal f调用完函数f,通过jr $ra回到main函数中jal f的下一条指令位置,但你的main函数在jal f之后没有任何终止程序执行的指令(比如用于触发退出操作的系统调用指令)。 - MIPS程序执行时,CPU会按内存地址顺序依次执行指令,
jal f之后的.data和.align 0是汇编伪指令,不会生成可执行机器码,CPU会继续读取后续内存中的内容,而这些内容大概率是重复的旧指令或无效指令,最终导致程序进入无限循环的执行流。
修复示例
你可以在main函数的jal f之后添加退出程序的指令,让程序正常终止:
f: li $2, 0x2 addi $2, $2, 0x0 jr $ra main: jal f li $v0, 10 # 加载退出系统调用的编号10到$v0寄存器 syscall # 执行系统调用,终止程序 .data .align 0
内容的提问来源于stack exchange,提问作者RBB
相关产品推荐
相关产品推荐

