2013-09-25 4 views
0

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

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.

+2

Вам нужно SYSCALL выход в явном виде. –

+0

приятно :) спасибо! – itpdg

+1

Возможный дубликат [Nass segmentation fault] (https://stackoverflow.com/questions/19760002/nasm-segmentation-fault) –

ответ

3

As n.m. сказал в комментариях, проблема в том, что вы не выходите из программы, поэтому выполнение запускается в код мусора, и вы получаете segfault.

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

%define ___SYSCALL_EXIT 1 

// ... at the end of _start: 
    mov eax, ___SYSCALL_EXIT 
    mov ebx, 0 
    int 0x80 
Смежные вопросы