MIPS PLP回文检查器代码异常求助:所有输入均输出No
以下是针对问题的具体排查方向和修正建议:
UART字符串接收有效性检查
确认接收的字符串是否正确存储并添加了\0终止符。PLP的UART接收通常会带回车/换行符(\r/\n),如果未将这些字符替换为\0,后续的长度计算、字符比较会读取到无效内容,导致判断逻辑失效。可以通过内存调试工具查看字符串的实际存储内容,验证是否存在乱码或缺失终止符的情况。字符串长度计算逻辑校验
检查长度计算函数的终止条件:如果错误地将'\n'而非'\0'作为终止判断,会导致长度计算错误,进而让首尾指针的定位出现偏差。
错误示例:len_loop: lb $t0, 0($a0) beq $t0, '\n', len_exit # 错误:应判断'\0' addi $v0, $v0, 1 addi $a0, $a0, 1 j len_loop修正:将终止符判断改为
'\0',同时在UART接收完成后,把换行/回车符替换为'\0'。回文判断的指针定位错误
验证首尾指针的初始化逻辑:尾指针应指向字符串的最后一个有效字符(即起始地址 + 长度 - 1),如果错误地指向了终止符(起始地址 + 长度),会导致第一次字符比较就和无效值对比,直接返回非回文。
错误示例:add $t1, $a0, $v0 # $v0为字符串长度,此处尾指针指向'\0'修正:
addi $t1, $a0, -1; add $t1, $t1, $v0回文循环终止条件错误
检查循环终止逻辑:正确的条件应为“首指针小于尾指针时继续比较”,如果写成反向条件(比如gt而非lt),会直接跳过所有比较步骤,返回非回文结果。返回值判断逻辑反向
确认主函数对回文判断函数返回值的处理:如果函数返回1表示是回文、0表示非回文,但主函数错误地写成beq $v0, 1, print_no,会导致所有情况都输出“No”。输出模块独立性验证
直接调用输出“Yes”的函数,验证UART输出功能是否正常。如果无法输出“Yes”,说明输出模块本身存在问题,需要优先排查输出函数的实现逻辑。
内容的提问来源于stack exchange,提问作者stgiv

