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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:47:36