Ошибка сегментации сборки после выполнения системного вызова, в конце моего кода

Я экспериментировал и получил следующий код сборки, который работает очень хорошо, за исключением того, что я получаю сообщение "Ошибка сегментации (сброшено ядро)" непосредственно перед завершением моей программы:

GLOBAL _start

%define ___STDIN 0
%define ___STDOUT 1
%define ___SYSCALL_WRITE 0x04

segment .data
segment .rodata
    L1 db "hello World", 10, 0
segment .bss
segment .text
_start:
    mov eax, ___SYSCALL_WRITE
    mov ebx, ___STDOUT
    mov ecx, L1
    mov edx, 13
    int 0x80

Неважно, есть ли у меня ret в конце; Я все еще получаю сообщение.

В чем проблема?

Я использую x86 и NASM.

1 ответ

Как сказал в комментариях nm, проблема в том, что вы не выходите из программы, поэтому выполнение запускается в мусорный код, и вы получаете ошибку сегмента.

Что вам нужно это:

%define ___SYSCALL_EXIT 1

// ... at the end of _start:
    mov eax, ___SYSCALL_EXIT
    mov ebx, 0
    int 0x80
Другие вопросы по тегам