2014-10-24 4 views
0

Когда я запускаю свою программу, у меня есть ошибка сбоя сегментации. Я не понимаю, почему.Ассемблер ошибок сегментации

.data 
    str1: .string "hello" 
    str2: .string "world" 
.text 
.globl _start 
_start: 
    pushl $str1 
    call puts 
    call strcall 
    call finish 

strcall: 
    pushl $str2 
    call puts 
    ret 
finish: 
    movl $1, %eax 
    movl $0, %ebx 
    int $0x80 

Любая идея, почему это происходит?

ответ

1

Нормальное соглашение о вызове cdecl обязывает, чтобы вызывающий абонент удалял аргументы, которые он помещал в стек. Поскольку вы не делаете этого в strcall, pushl $str2 все еще находится в стеке, и ret попытается использовать это как обратный адрес. Решение: вставьте addl $4, %esp до ret.

В следующий раз используйте отладчик, чтобы узнать, где проблема для вас.

Кроме того, если вы намерены использовать функции библиотеки C, вы должны действительно использовать main в качестве точки входа и скомпилировать с помощью gcc, чтобы вы правильно инициализировали библиотеку C. Аналогично, вы не должны использовать системный вызов exit, вы должны просто вернуться с main или, если это абсолютно необходимо, call exit из библиотеки C.

+0

Спасибо, это было то, что мне нужно. – AntXXX18

Смежные вопросы