Problema Errore di segmentazione (core dump creato)

di il
5 risposte

Problema Errore di segmentazione (core dump creato)

Salve, sto provando a compilare ed eseguire un programma scritto in assembly semplicissimo, ma non riesco a capire dove sbaglio.

Codice del programma:

section .text
global _start
_start:
mov eax,0
Qualsiasi sia l'operazione, una mov, uno xor eax,eax o qualsiasi altra cosa, quando vado sul terminale e compilo, linko ed eseguo nel seguente modo:

nasm -f elf32 file.nasm
ld -m elf_i386 file.o
./a.out 
Ottengo come da titolo un Errore di segmentazione. Qualcuno riesce ad aiutarmi? Dove sbaglio?

5 Risposte

  • Re: Problema Errore di segmentazione (core dump creato)

    Dopo la mov cosa c'è?
  • Re: Problema Errore di segmentazione (core dump creato)

    Non ho messo nulla, solo quella singola operazione.
  • Re: Problema Errore di segmentazione (core dump creato)

    Quindi è ovvio che dopo venga eseguito codice spazzattura e avrai un segnale fault. Devi concludere il programma con una

    ret
  • Re: Problema Errore di segmentazione (core dump creato)

    Ho già provato ad inserire le ret, come anche a creare un nuovo stack frame:
    
    push ebp
    mov ebp, esp
    altro codice...
    mov esp, ebp
    pop ebp
    
    Ma ottengo sempre un errore di segmentazione. Mi suona essere una cosa strana, mentre se stampo una semplice stringa nel seguente modo:
    
    section     .text
    global      _start
    
    _start:
        mov ebx, 0x1
        mov ecx, stringa
        mov edx, len
        mov eax, 0x4
        int 80h
    (qui con e senza ret)
    section .data
        stringa db "Hello World", 0xa
        len equ $-stringa
     
    non ho nessun problema nella stampa ma comunque seguito dalla stringa errore di segmentazione. C'è da dire comunque che utilizzando gdb come debugger noto che dopo quell'operazione li che a runtime viene eseguita c'è ne sono molte altre, ci sono molte mov e add.

    Non riesco a capire come mai, sarà un problema del compilatore?
  • Re: Problema Errore di segmentazione (core dump creato)

    Con Linux la exit del processo è fatta con
    
            mov eax, 1
            int 0x80
    
    Quindi
    
    section .text
    global _start
    _start:
            mov eax, 4
            mov ebx, 1
            mov ecx, stringa
            mov edx, len
            int 0x80
    
            mov eax, 1
            int 0x80
    
    section .data
    stringa db "Hello World", 0xa
    len equ $-stringa
    
    
Devi accedere o registrarti per scrivere nel forum
5 risposte