在MARS 4_5的MIPS汇编程序中,如何检测输入是否为浮点数并报错?
处理MIPS汇编中浮点数输入的错误判断方案
在MARS 4.5中,直接使用syscall 5(读取整数)无法检测浮点数输入——它会自动截断小数点后的内容,不会触发错误。要实现对带小数输入的校验,必须先将输入作为字符串读取,再逐字符验证是否为纯数字且无小数点等非法字符,最后再转换为整数并校验正整数规则。
实现步骤与代码示例
1. 数据段定义
首先在数据段中定义输入缓冲区、提示信息和错误信息:
.data prompt: .asciiz "请输入正整数:" error_msg: .asciiz "输入错误:仅允许输入正整数!" input_buf: .space 100 # 分配足够大的缓冲区存储输入字符串
2. 核心校验与转换逻辑
代码段中先读取输入字符串,逐字符检查合法性,再转换为整数:
.text .globl main main: # 打印输入提示 li $v0, 4 la $a0, prompt syscall # 读取输入字符串到缓冲区 li $v0, 8 la $a0, input_buf li $a1, 100 # 最多读取99个字符(留1位存结束符) syscall # 初始化寄存器: # $t0 = 当前字符地址,$t1 = 当前字符,$t2 = 合法性标记(1=合法,0=非法),$t3 = 转换后的整数 la $t0, input_buf li $t2, 1 li $t3, 0 check_char: lb $t1, ($t0) # 读取当前字符 beq $t1, '\n', end_check # 遇到换行符(输入结束),跳转到检查收尾 beq $t1, '\0', end_check # 遇到字符串结束符,跳转到检查收尾 # 检查是否为小数点:是则标记非法 beq $t1, '.', mark_invalid # 检查是否为数字:不是则标记非法 blt $t1, '0', mark_invalid bgt $t1, '9', mark_invalid # 将字符转换为数字并累加到整数中 sub $t1, $t1, '0' # '0'的ASCII码是48,减去后得到数字值 mul $t3, $t3, 10 # 整数左移一位(乘10) add $t3, $t3, $t1 # 加上当前数字 addi $t0, $t0, 1 # 移动到下一个字符 j check_char mark_invalid: li $t2, 0 # 标记为非法输入 j end_check end_check: # 检查:是否非法,或者转换后的整数<=0(负数或0) beq $t2, 0, error blez $t3, error # 到这里说明输入合法,可继续后续逻辑 # (示例:打印合法的正整数) li $v0, 1 move $a0, $t3 syscall j exit error: # 打印错误信息 li $v0, 4 la $a0, error_msg syscall exit: # 退出程序 li $v0, 10 syscall
关键说明
- 字符串读取:使用
syscall 8读取输入,避免syscall 5自动截断浮点数的问题。 - 逐字符校验:检查每个字符是否为数字,同时拦截小数点、负号、非数字字符。
- 整数转换:将合法的数字字符逐位转换为整数,最后校验是否为正整数(>0)。
内容的提问来源于stack exchange,提问作者Cláudia Seabra
相关产品推荐
相关产品推荐

