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

MASM调用IRVINE32.inc用栈检测回文字符串时始终返回非回文问题

问题根因及修复方案
  • 字符串结尾符不匹配IRVINE32库要求
    IRVINE32的writeString函数以0(即\0)作为字符串结束标记,你当前代码使用$作为结束符,导致writeString读取str2时无法识别结束位置,要么输出空要么输出乱码,这是str2无输出的直接原因。
    修复方案:
    1. 输入字符串str1的定义改为str1 BYTE 30 DUP(0)
    2. 所有判断结束、追加结束符的逻辑把'$'替换为0
  • 逆序字符串少存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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:36:07