求编写实现数字输入、字母输入时提示错误的MIPS代码,现有代码如下
MIPS汇编实现数字输入校验(字母输入提示错误)
你当前使用syscall 5(读取整数)的方式有个局限:这个系统调用会自动跳过所有非数字字符(包括字母),直接等待有效整数输入,无法检测到用户输入的字母并提示错误。要实现输入校验,需要先读取完整输入字符串,再逐个字符验证是否为数字,具体实现如下:
完整代码
.data prompt: .asciiz "请输入一个数字:" error_msg: .asciiz "输入错误:请输入有效的数字!" buffer: .space 20 # 定义输入缓冲区,最多存19个字符加结束符 .text .globl main main: # 打印输入提示 li $v0, 4 la $a0, prompt syscall # 读取输入字符串到缓冲区 li $v0, 8 la $a0, buffer li $a1, 20 # 最多读取19个字符(留1位给结束符) syscall # 初始化寄存器:$t0=缓冲区地址,$t1=当前字符,$s0=转换后的整数,$t2=是否有效标记(1=有效,0=无效) la $t0, buffer li $s0, 0 li $t2, 1 check_char: lb $t1, ($t0) # 读取当前字符 beq $t1, '\n', convert_done # 遇到换行符,结束校验 beq $t1, '\0', convert_done # 遇到字符串结束符,结束校验 # 检查字符是否在'0'-'9'之间 blt $t1, '0', mark_invalid bgt $t1, '9', mark_invalid # 字符是数字,转换为数值并累加到$s0 sub $t1, $t1, '0' # 字符转数字(如'5'→5) mul $s0, $s0, 10 # 原数×10 add $s0, $s0, $t1 # 加上当前数字 addi $t0, $t0, 1 # 移动到下一个字符 j check_char mark_invalid: li $t2, 0 # 标记输入无效 j error_exit # 跳转到错误提示 convert_done: beq $t2, 0, error_exit # 如果标记无效,跳错误提示 # 这里可以添加对有效数字的后续处理,比如打印结果 li $v0, 1 move $a0, $s0 syscall j exit_program error_exit: # 打印错误提示 li $v0, 4 la $a0, error_msg syscall exit_program: # 退出程序 li $v0, 10 syscall
关键逻辑说明
- 字符串读取:用
syscall 8读取输入,相比syscall 5能捕获完整输入内容,包括字母等非法字符。 - 字符校验:遍历每个字符,判断是否在ASCII码'0'(48)到'9'(57)之间,只要有一个字符不符合,就标记为无效并提示错误。
- 数字转换:合法字符通过
sub $t1, $t1, '0'转为数值,再通过mul $s0, $s0, 10和add操作拼接成完整整数,存入$s0寄存器。 - 错误处理:一旦检测到非数字字符,立即跳转到错误提示流程,若需要循环校验可自行添加分支跳转实现重新输入。
内容的提问来源于stack exchange,提问作者joey
相关产品推荐
相关产品推荐

