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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:49:56