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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:40:43