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

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

错误排查与修复

核心错误点

  1. 多余的syscall指令:在执行sb $v0, store之后,你额外调用了一次syscall,但此时$v0寄存器的值还是之前的12(字符读取的系统调用编号),再次执行会触发无效的系统调用操作,直接导致程序报错。
  2. 输入缓冲区残留问题(可选优化):使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:15:44