MIPS程序输入'y'重复功能报错,请求错误排查
MIPS程序重复输入功能报错排查
问题描述
编写了一段MIPS程序,功能是读取用户输入的整数并打印,之后询问用户输入'y'重复程序、'n'退出程序。目前程序可正常读取并打印整数,但输入'y'或'n'后会报错,疑惑问题出在beq指令还是字符读取部分。
原程序代码
.data repeat: .asciiz "\n Repeat [y/n]? " store: .byte ' ' .text .globl main main: # Main function li $v0, 5 syscall move $a0, $v0 li $v0, 1 syscall li $v0, 4 la $a0, repeat syscall li $v0, 12 syscall la $s0, store sb $v0, store syscall beq $v0, 'y', main beq $v0, 'Y', main li $v0, 10 syscall
错误排查与修复
核心错误点
- 多余的
syscall指令:在执行sb $v0, store之后,你额外调用了一次syscall,但此时$v0寄存器的值还是之前的12(字符读取的系统调用编号),再次执行会触发无效的系统调用操作,直接导致程序报错。 - 输入缓冲区残留问题(可选优化):使用
li $v0,12读取字符时,只会读取单个字符,但用户输入字符后按下的换行符会留在输入缓冲区中。如果后续还有输入操作,可能会读取到这个残留的换行符,干扰程序逻辑。
修复后的代码
.data repeat: .asciiz "\n Repeat [y/n]? " store: .byte ' ' .text .globl main main: # Main function li $v0, 5 syscall move $a0, $v0 li $v0, 1 syscall li $v0, 4 la $a0, repeat syscall li $v0, 12 syscall la $s0, store sb $v0, store # 移除多余的syscall # 可选:消耗输入缓冲区的换行符,避免干扰后续输入 li $v0, 12 syscall beq $v0, 'y', main beq $v0, 'Y', main li $v0, 10 syscall
说明
- 移除多余的
syscall后,程序能正常执行分支判断:输入'y'/'Y'会回到main标签重复流程,输入其他字符则执行退出系统调用。 - 新增的额外字符读取操作是为了处理用户输入后的换行符,避免后续循环中误读取到这个残留字符。
内容的提问来源于stack exchange,提问作者Liyanna
相关产品推荐
相关产品推荐

