PCSpim MIPS模拟器代码报错排查及回文程序开发求助
MIPS回文判断程序报错排查与修复
问题背景
使用PCSpim_9.1.4编写MIPS回文判断程序时,加载文件提示第6行li $s0, 0存在语法错误,删除该行后又出现新的未明确错误。程序需求为:从数据段读取C风格空终止字符串,先计算其长度存入r8寄存器,再判断是否为回文,结果存入r9(1表示是回文,0表示非回文)。
报错信息
加载文件时发生错误,提示信息如下:spim:
(parser) 在文件C:\Users\HP\Documents\palindrome.asm的第6行存在语法错误:li $s0, 0 # initializing the
register to hold the string's length"
报错原因分析
- PCSpim寄存器命名兼容问题:旧版本PCSpim对
$s0这类伪寄存器名称支持不佳,需使用对应的硬件寄存器编号(如$s0对应$16)。 - 原程序逻辑缺失:原代码仅实现了字符串长度计数的部分逻辑,完全没有回文判断的核心对比步骤,且寄存器使用不符合需求(未将长度存入r8、结果存入r9)。
修复后的完整代码
.data string: .asciiz "put the string here" # C风格空终止字符串 .text main: li $8, 0 # r8寄存器初始化,用于存储字符串长度 li $9, 0 # r9寄存器初始化,存储回文判断结果(1是,0否) li $10, 0 # 左指针,指向字符串起始位置 li $11, 0 # 右指针,指向字符串末尾位置 # 第一步:计算字符串长度并存入r8 calc_length: lb $t0, string($8) # 读取当前字符 beqz $t0, setup_pointers # 读到空字符,结束长度计算 addi $8, $8, 1 # 长度加1 j calc_length setup_pointers: addi $11, $8, -1 # 右指针指向最后一个有效字符(长度-1) # 第二步:首尾对比判断回文 check_palindrome: bge $10, $11, is_palindrome # 左指针 >= 右指针,说明是回文 lb $t1, string($10) # 读取左指针指向的字符 lb $t2, string($11) # 读取右指针指向的字符 bne $t1, $t2, not_palindrome # 字符不相等,不是回文 addi $10, $10, 1 # 左指针右移 addi $11, $11, -1 # 右指针左移 j check_palindrome is_palindrome: li $9, 1 # 标记为回文 j print_result not_palindrome: li $9, 0 # 标记为非回文 # 打印结果 print_result: li $v0, 1 # 系统调用:打印整数 move $a0, $9 # 将结果r9传入参数寄存器 syscall # 执行打印 exit: j exit # 无限循环终止程序
修复说明
- 解决语法错误:全部使用硬件寄存器编号(如
$8对应r8,$9对应r9),规避PCSpim对伪寄存器的兼容性问题。 - 补全回文逻辑:通过双指针法实现首尾字符对比,完成回文判断的核心逻辑。
- 匹配需求:严格按照要求将字符串长度存入r8寄存器,判断结果存入r9寄存器。
内容的提问来源于stack exchange,提问作者EngineeringStudent
相关产品推荐
相关产品推荐

