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