32位NASM汇编回文检测异常:段错误修复后全量误判非回文
汇编回文检测异常:所有输入均被判定为非回文
我是汇编编程新手,正在通过练习任务学习相关知识。其中两个任务运行正常,但另外两个曾出现Segmentation Fault(段错误),查阅大量资料后仍无法解决。
已根据给出的修正调整了代码,palindrome_check不再出现段错误,但所有输入字符串均被判定为非回文。已确认C语言的is_palindrome函数工作正常,安装了GEF调试器但无法定位问题,恳请技术方向指导。
C驱动代码
#include <string.h> #include <stdio.h> #include <stdlib.h> extern int is_palindrome(char *s); extern void palindrome_check(); int is_palindrome(char *s){ int len=strlen(s); for(int i=0;i<len/2;i++){ if(s[i] != s[len -i -1]){ return 0; } } return 1; } int main() { int choice; int result1; char str2[1024]; do { printf("\nMenu:\n"); printf("1) Test if a string is a palindrome (from C to ASM)\n"); printf("2) Test if a string is a palindrome (from ASM to C)\n"); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: printf("Enter a string: "); scanf("%s",str2); result1=is_palindrome(str2); if(result1==1){ printf("It is a palindrome"); } else { printf("It is NOT a palindrome"); } break; case 2: palindrome_check(); break; } } while(1); return 0; }
汇编代码(functions.asm)
BITS 32 extern is_palindrome GLOBAL is_palindrome GLOBAL palindrome_check SECTION .bss buf1 resb 1024 buf resb 1024 len1 resd 1 SECTION .data prompt db "Please enter a string:",0x0A lenprompt equ $ - prompt palindrome_msg db "It is a palindrome",0x0A lenpamsg equ $ - palindrome_msg not_palindrome_msg db "It is NOT a palindrome",0x0A lenntpamsg equ $ - not_palindrome_msg SECTION .text palindrome_check: mov eax,4 mov ebx,1 mov ecx,prompt mov edx,lenprompt int 0x80 mov eax,3 mov ebx,0 mov ecx,buf mov edx,1024 int 0x80 push ecx call is_palindrome add esp,4 cmp eax,1 jne .palindrome_failed mov eax,4 mov ebx,1 mov ecx,palindrome_msg mov edx,lenpamsg int 0x80 jmp .end .palindrome_failed: mov eax,4 mov ebx,1 mov ecx,not_palindrome_msg mov edx,lenntpamsg int 0x80 .end: ret is_palindrome: mov eax,[esp+4] mov [buf1],eax ;Calculate the length of the string xor eax,eax mov esi,[buf1] len_loop: cmp BYTE[esi],10 je set_len inc eax inc esi jmp len_loop set_len: mov BYTE[esi-1],0 mov [len1],eax mov ebx,[buf1] call is_palindrome_asm ret is_palindrome_asm: mov eax,[len1] mov edi,eax dec edi xor ecx,ecx mov esi,ebx palindrome_loop: cmp ecx,edi jae .done mov al,[esi+ecx] mov bl,[esi+edi] cmp al,bl jne .not_palindrome inc ecx dec edi jmp palindrome_loop .not_palindrome: mov eax,0 ret .done: mov eax,1 ret
编译命令
nasm -g -f elf32 -F dwarf -o functions.o functions.asm gcc -g -Wall -static -m32 -o backandforth backandforth.c functions.o
关键问题点分析
palindrome_check缺失ret指令:执行完后无法正确返回,导致流程异常- 函数名调用错误:汇编中原本调用
is_palindrome_c,但C中定义的函数是is_palindrome,需修正 - 字符串长度计算逻辑错误:原代码先递增再判断,会跳过第一个字符的检查,且未处理读入字符串末尾的换行符
is_palindrome_asm索引错误:字符串末尾索引应为len-1,原代码直接使用len导致访问越界- 未定义
len1变量:需在.bss段补充len1 resd 1定义 is_palindrome缺失ret指令:无法将结果返回给C调用者palindrome_check无跳转逻辑:即使判定为回文,仍会执行非回文输出分支,需添加jmp跳过
内容的提问来源于stack exchange,提问作者Code In
相关产品推荐
相关产品推荐

