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

x86 MASM回文检测函数异常求助:始终返回EAX=0

x86 MASM回文检测始终返回0的问题修复

问题根源

  1. 循环计数器被破坏:在palindromeCheck循环中,你用mov cl,[ebx+edx]把字符加载到CL寄存器,但ECX原本是控制循环次数的计数器,这直接打乱了循环逻辑,导致程序很快进入notPalindrome分支。
  2. 掩码被意外覆盖:你把大小写转换的掩码存在AL寄存器,但后续用AL加载右字符,导致掩码丢失,无法正确完成大小写统一。
  3. 比较逻辑错误:你已经将左右字符转成大写,却又去比较转换后的左字符和原右字符,等于白做了大小写转换,无法忽略大小写差异。

修正后的汇编代码

.686
.model flat

.code

_testPalindrome PROC    
    push ebp
    mov ebp,esp     ; 初始化栈基址
    
    mov ebx,[ebp+8]     ; 获取输入字符串首地址
    xor ecx,ecx
    xor dl,dl
    mov esi,0DFh       ; 保存小写转大写的掩码(0xDF=223)

arrayEnd:                   
    cmp byte ptr [ebx+ecx],dl  ; 逐字节检查是否到字符串结束符\0
    je continue             
    inc ecx
    jmp arrayEnd
            
continue:                   
    mov edx,0               ; edx作为左指针,从字符串头部开始
    mov edi,ecx             
    dec edi                 ; edi作为右指针,指向最后一个有效字符(跳过\0)
    shr ecx,1               ; 循环次数减半,只需检查到字符串中间
    
palindromeCheck:
    cmp ecx, 0
    je yesPalindrome        

    ; 取出左右字符并转换为大写,使用不影响循环计数器的寄存器
    mov ah,[ebx+edx]        
    and ah,esi              ; 左字符转大写
    mov al,[ebx+edi]        
    and al,esi              ; 右字符转大写

    cmp ah,al               ; 比较转换后的两个字符
    jne notPalindrome

    dec ecx                 ; 剩余检查次数减1
    inc edx                 ; 左指针右移一位
    dec edi                 ; 右指针左移一位
    jmp palindromeCheck     

yesPalindrome:
    mov eax,1               ; 是回文,返回1
    jmp allDone

notPalindrome:
    mov eax,0               ; 不是回文,返回0

allDone:
    pop ebp
    ret

_testPalindrome ENDP

END

关键修正说明

  • 将大小写转换掩码存入esi寄存器,避免被后续字符加载操作覆盖。
  • 使用ah和al存储转换后的左右字符,不再占用循环计数器ECX的CL部分,保证循环逻辑正常。
  • 直接比较转换后的两个字符,确保大小写不敏感的检测逻辑生效。
  • 明确标注byte ptr指定内存操作的宽度,避免汇编器产生歧义。

内容的提问来源于stack exchange,提问作者user24909579

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:55:22