MASM调用IRVINE32.inc用栈检测回文字符串时始终返回非回文问题
问题根因及修复方案
- 字符串结尾符不匹配IRVINE32库要求
IRVINE32的writeString函数以0(即\0)作为字符串结束标记,你当前代码使用$作为结束符,导致writeString读取str2时无法识别结束位置,要么输出空要么输出乱码,这是str2无输出的直接原因。
修复方案:- 输入字符串str1的定义改为
str1 BYTE 30 DUP(0) - 所有判断结束、追加结束符的逻辑把
'$'替换为0
- 输入字符串str1的定义改为
- 逆序字符串少存1个有效字符
你计算得到lengthStr为原字符串有效长度后,执行了sub ecx, 1才启动L2循环弹出栈字符,导致压入栈的N个有效字符只弹出了N-1个存入str2,逆序串长度比原串少1,对比必然不相等,这是回文判断始终失败的核心原因。
修复方案:删除L2循环前的
sub ecx, 1代码行,让L2循环次数等于原串有效长度,所有压栈字符都弹出存入str2。 - 压栈操作存在位宽不匹配隐患
32位模式下push [esi]默认压入4字节DWORD,而你实际只需要压入1字节的字符,虽然当前取al不会直接出错,但存在非法访问相邻内存的风险。
修复方案:将压栈代码改为明确指定位宽:
push BYTE PTR [esi] - 手动操作返回地址易引发栈平衡错误
你开头pop address保存返回地址、结尾push address返回的操作容错性极低,后续修改栈操作逻辑时很容易搞乱栈结构。
修复方案:用标准栈帧写法替代手动操作返回地址:
checkPalindrome PROC push ebp mov ebp, esp ; 原有业务逻辑写在此处,无需手动操作返回地址 leave ret checkPalindrome ENDP - 回文对比逻辑循环次数错误
你启动对比循环L0前又执行了sub ecx, 1,导致N长度的字符串只对比前N-1个字符,最后一个字符没有参与校验,存在漏判风险。
修复方案:删除L0循环前的
sub ecx, 1代码行,让循环次数等于字符串有效长度。
内容的提问来源于stack exchange,提问作者elijah
相关产品推荐
相关产品推荐

