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

MIPS特定字符处理程序QtSim语法错误排查请求

问题排查与代码修正

一、语法错误原因及修复

报错行的问题是标签缩进不规范:MIPS汇编中,标签(如lower_to_upper、convert_letter、skip)需要与同级代码标签(如while、check_number)保持一致的缩进层级,SPIM解析器对标签的位置敏感,过度缩进会触发语法错误。

修复方法:将lower_to_upper、convert_letter、skip这几个标签的缩进调整为和其他标签一致(比如顶格或与while同层级)。

二、功能逻辑修正(符合需求)

原代码存在多处逻辑不符合需求的问题,一并修正:

  • 字母范围硬编码问题:需求中β是第M个小写字母,Δ是第M个大写字母,应通过计算得到,而非硬编码固定值。
  • N与M的逻辑关系错误:base-N的有效数包含10个数字+M个字母,因此N = 10 + M,需动态计算而非固定为7。
  • 输入读取边界问题:要读取恰好10个字符(不含终止符),需将userInput的空间设为11(留位置存终止符),读取长度设为11。
  • 小写字母范围判断错误:应基于大写END值+32得到小写β的ASCII值,而非硬编码。

三、修正后的完整代码

.data
    prompt: .asciiz "Input: "
    M: .word 3  # 示例M值,可根据需求修改(需≤26,因为英文字母共26个)
    newline: .asciiz "\n"
    output: .asciiz "Output: "
    userInput: .space 11  # 10个字符+1个终止符
.text
    main:
        # 加载并计算关键值
        lw $t4, M          # 加载M到t4
        addi $t5, $t4, 10  # N = 10 + M,存入t5
        addi $t6, $zero, 65 # 'A'的ASCII值
        add $t7, $t6, $t4
        subi $t7, $t7, 1   # Δ = 'A' + M -1,存入t7(大写字母上限)
        addi $t8, $t7, 32  # β = Δ +32,存入t8(小写字母上限)
        
        la $s2, newline
        la $s3, output
        
        # 提示输入
        li $v0, 4
        la $a0, prompt
        syscall
        
        # 读取用户输入(最多10个字符+终止符)
        li $v0, 8
        la $a0, userInput
        li $a1, 11
        syscall
        
        addi $t1, $zero, 0  # 计数器:已处理字符数
        addi $t3, $zero, 0  # 有效数总和
        la $t2, userInput   # 输入字符串指针
        
    while:
        beq $t1, 10, end    # 处理完10个字符后退出循环
        
        lbu $t0, ($t2)      # 加载当前字符
        
        # 判断是否为数字0-9
        bge $t0, 48, check_number
        j skip
        
    check_number:
        ble $t0, 57, convert_0_9
        j check_upper_case
        
    check_upper_case:
        # 判断是否为A-Δ
        blt $t0, 65, check_lower_case
        bgt $t0, $t7, check_lower_case
        j convert_upper_letter
        
    check_lower_case:
        # 判断是否为a-β
        blt $t0, 97, skip
        bgt $t0, $t8, skip
        # 转换为大写
        subi $t0, $t0, 32
        j convert_upper_letter
        
    convert_0_9:
        subi $t0, $t0, 48   # 数字转0-9
        j add_to_total
        
    convert_upper_letter:
        subi $t0, $t0, 55   # A-Z转10-35
        j add_to_total
        
    add_to_total:
        add $t3, $t3, $t0   # 累加到总和
        
    skip:
        addi $t1, $t1, 1    # 计数器+1
        addi $t2, $t2, 1    # 指针+1
        j while
        
    end:
        mul $s0, $t3, $t5   # 总和乘以N
        
        # 输出结果
        li $v0, 4
        la $a0, newline
        syscall
        
        li $v0, 4
        la $a0, output
        syscall
        
        li $v0, 36          # 无符号十进制输出
        move $a0, $s0
        syscall
        
        # 程序结束
        li $v0, 10
        syscall

四、代码说明

  • 动态计算范围:根据M值自动计算N、大写字母上限Δ、小写字母上限β,无需硬编码,符合需求灵活性。
  • 输入处理:确保读取恰好10个字符,避免终止符占用有效字符位置。
  • 有效数判断:严格按照需求筛选数字、指定范围的大小写字母,无效字符直接跳过。
  • 结果输出:无有效数时总和为0,乘以N后仍输出0,符合需求要求。

内容的提问来源于stack exchange,提问作者Carla Thornton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:05:21