汇编语言回文检查器输出错误:正确回文被误判为非回文
回文检查器误判问题的修复方案
你的ARM汇编代码存在三个关键问题,导致回文被误判:
- 栈弹出的地址偏移错误:
LDRB W1, [SP], #16中,每次弹出字符后SP自增16,但每个字符仅占1字节,这会导致你从栈中取到完全错误的字符。应该把偏移量改为#1,对应单字节的字符数据。 - 分支逻辑错误:比较字符后,
B.EQ pal会直接跳转到回文成功的分支,完全跳过了后续的循环检查。实际上只有当字符不相等时才需要跳转到非回文分支,相等的话应该继续执行循环,完成所有字符对的检查。 - 循环计数器更新顺序错误:
ADD X3, X3, #1和CMP X3, X2放在了分支跳转之后,这意味着只要进入分支,计数器就不会递增,循环最多执行一次就终止了。需要把这两行移到字符比较相等的逻辑之后,确保每次检查完一对字符都能更新计数器并判断是否继续循环。
修正后的代码如下:
endOfString: mov x4, #2 sdiv X2, X2, X4 // 将X2除以2 --> 得到需要检查的外侧字符对的次数 MOV X3, #0 // 计数器 LDR X0, =output LDR x5, =input compareChar: LDRB W1, [SP], #1 // 修正:偏移量改为1,每次弹出1字节字符 LDRB W2, [X5], #1 // 从X5加载字节数据到W2,地址自增1 CMP W1, W2 // 检查字符对 B.NE Palno // 字符不相等,判定非回文 // 字符相等,更新计数器并判断是否继续循环 ADD X3, X3, #1 CMP X3, X2 B.LE compareChar // 所有字符对检查完成,判定为回文 pal: // 这里添加回文成功的处理逻辑 B end // 示例:跳转到结束或执行输出 Palno: // 这里添加非回文的处理逻辑 B end // 示例:跳转到结束或执行输出
补充说明:
- 确保栈中已经正确压入了字符串的所有字符,且压入顺序是从左到右(这样弹出时就是从右到左,对应回文的反向字符)。
- 要注意字符串的长度X2必须是正确的(包含所有有效字符,不包含终止符的话需要提前处理)。
内容的提问来源于stack exchange,提问作者kate
相关产品推荐
相关产品推荐

