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
相关产品推荐
相关产品推荐

