PLP工具下MIPS汇编回文检查器输出不符合预期问题求助
MIPS汇编回文检查器问题修复方案
已定位的问题点
- 回文比较逻辑错误:原代码
bne $s5, $t0, not_palindrome错误地将尾部字符与句号ASCII值$t0比较,未对比首尾两个字符,只要尾部字符不是句号就直接判定非回文,这是所有输入都输出no的直接原因。 - 大小写转换逻辑完全错误:
- 判断逻辑反向:
slt $t6, $v0, $t5是判断字符是否小于'Z',原代码小于就跳转转换,和要求的「小写字符(大于'Z')才转大写」逻辑相反 - 跳转位置错误:
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
相关产品推荐
相关产品推荐

