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

PLP工具下MIPS汇编回文检查器输出不符合预期问题求助

MIPS汇编回文检查器问题修复方案

已定位的问题点

  • 回文比较逻辑错误:原代码bne $s5, $t0, not_palindrome错误地将尾部字符与句号ASCII值$t0比较,未对比首尾两个字符,只要尾部字符不是句号就直接判定非回文,这是所有输入都输出no的直接原因。
  • 大小写转换逻辑完全错误:
    1. 判断逻辑反向:slt $t6, $v0, $t5是判断字符是否小于'Z',原代码小于就跳转转换,和要求的「小写字符(大于'Z')才转大写」逻辑相反
    2. 跳转位置错误:convert标签直接写在判断语句下一行,无论判断结果如何都会执行addiu $v0, $v0, -32,所有字符都会被错误减32,大写字符会变为乱码
  • 回文检查指针偏移错误:原代码开头addiu $s2, $s2, -8,按设计array_push后s2指向最后一个字符的下一个位置,仅需减4即可指向最后一个有效字符,减8会跳过最后一位字符
  • 回文循环结束条件错误:原代码bne $t8, $t0, check_loop错误地用句号值$t0做判断,应该判断$t8是否为1(即s3 < s2时继续循环)
  • UART轮询逻辑错误:原代码beq $t3, $0, main会直接跳回主函数破坏返回地址,应该在poll_UART内部循环等待数据就绪
  • space_check函数缺失延迟槽nop,可能导致跳转前错误执行jr $ra

关键代码修复示例

修复后的case_check函数

case_check:
    li $t5, 0x5A
    slt $t6, $t5, $v0 # 改为判断字符是否大于'Z'
    beq $t6, $0, case_return # 不是小写就直接返回
    nop
    addiu $v0, $v0, -32 # 仅小写字符执行转换
case_return:
    jr $ra
    nop

修复后的palindrome_check函数

palindrome_check:
addiu $s2, $s2, -4 # 仅减4指向最后一个有效字符
move $s3, $s1
check_loop:
lw $s4, 0($s3)
lw $s5, 0($s2)
bne $s4, $s5, not_palindrome # 对比首尾两个字符
nop
adjust_pointers:
addiu $s2, $s2, -4
addiu $s3, $s3, 4 
slt $t8, $s3, $s2
bne $t8, $0, check_loop # 判断s3是否小于s2,是则继续循环
nop
palindrome:
li $a0, 1
call project3_print
move $s2, $s1
j main 
nop
not_palindrome:
li $a0, 0
call project3_print 
move $s2, $s1
j main 
nop

修复后的poll_UART函数

poll_UART:
lw $t1, 4($s0)
li $t2, 0b10
and $t3, $t1, $t2
beq $t3, $0, poll_UART # 内部循环等待数据就绪,不跳回main
nop
lw $v0, 8($s0)
sw $t2, 0($s0)
jr $ra
nop

修复后的space_check函数

space_check:
li $t4, 0x20
beq $t4, $v0, main
nop # 补充延迟槽nop
jr $ra
nop

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:36:04