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

汇编语言回文检查器输出错误:正确回文被误判为非回文

回文检查器误判问题的修复方案

你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:52:40