x86 MASM回文检测函数异常求助:始终返回EAX=0
x86 MASM回文检测始终返回0的问题修复
问题根源
- 循环计数器被破坏:在
palindromeCheck循环中,你用mov cl,[ebx+edx]把字符加载到CL寄存器,但ECX原本是控制循环次数的计数器,这直接打乱了循环逻辑,导致程序很快进入notPalindrome分支。 - 掩码被意外覆盖:你把大小写转换的掩码存在AL寄存器,但后续用AL加载右字符,导致掩码丢失,无法正确完成大小写统一。
- 比较逻辑错误:你已经将左右字符转成大写,却又去比较转换后的左字符和原右字符,等于白做了大小写转换,无法忽略大小写差异。
修正后的汇编代码
.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
相关产品推荐
相关产品推荐

