2013-09-30 2 views
0

Для домашнего задания нам было предложено отсканировать номер, увеличить его на единицу и напечатать ответ. Однако код имеет тенденцию давать ошибку сегментации.Я продолжаю получать ошибки сегментации. Как стек используется в IA-32 с использованием AT & T?

.global main 

mystring: .asciz "Assignment 3: inout\n" 

string: .asciz "%d" 

main: pushl $mystring 
     call printf 
     jmp inout 

end: pushl $0 
     call exit 

Это в основном то, что мы делаем. Выполнение кода, подобного этому, не работает. Проблема заключается в методе inout

inout: subl $0, %esp    ;what is happening here 
     leal -4(%ebp), %eax  ;what am i doing here 
     pushl %ebp    ;why do i need to push the base pointer 
     movl %esp, %ebp 
     pushl %eax 
     pushl $string 
     call scanf 
     incl %eax 
     pushl %eax 
     pushl $string 
     call printf 

Это не работает. Я также не знаю, что означает начало (выражение, адресная вещь), см. Комментарий к дальнейшим вещам. Заранее спасибо!

ответ

0

Частичный ответ, но, возможно, это поможет вам отследить проблему:

subl $0, %espбудет расти стек, если константа не равна нулю. Верх стека обычно имеет наименьший адрес памяти в x86, то есть стеки растут вниз.

leal -4(%ebp), %eax загружает абсолютный адрес %ebp - 4 в %eax. Это указатель на ячейку памяти, где должно храниться целое число scanf d.

Почему вы находитесь push Исходный указатель действительно является актуальным вопросом. Вы обычно это делаете, потому что после этого вы меняете его, делаете что-то, а затем pop его, когда вы закончите - что вам кажется. Обычно он используется с функциями, которые вы call. Это может быть проблемой здесь, вы вызываете метод inout, но вы используете его как метку только для jmp. Код, который вы опубликовали сейчас, не имеет шансов вернуться туда, где он был jmp ed to.

Wikibooks имеет довольно краткое введение в рамки кадров x86.

+0

Кроме того, 'scanf' возвращает количество элементов, считанных в'% eax', а не число 'scanf'ed. Приращение '% eax' не даст результата, который вы ищете. –