# #assembly #x86 #nasm
Вопрос:
Я пытаюсь запустить программу nasm. Следующий код:
segment .data
contAir: dt 1.11330e-10
constOil: dt 2.33656e-10
segment .text
global calc
calc:
mov edx, 0
push ebp
;mov ebp, esp
;mov eax, [ebp 8]
ret
Я получаю ошибку сегментации (дамп ядра) при нажатии ebp в стеке. Это почему?
Я запускаю этот код на виртуальной машине Ubuntu.
Забавно, что иногда я получаю ошибку «незаконная инструкция».
Комментарии:
1. Вы тоже компилируете его на компьютере?
2. ДА. Это C-программа, которая использует некоторый ассемблерный код. Но C-код работает нормально, насколько мне показывают мои выходные данные.
3. Не могли бы вы, пожалуйста, добавить все источники к вашему вопросу?
4. Технически,
ret
это неправильный способ выйти из вашей программы и вернуться обратно в ОС. Вам нужно использоватьexit
илиint 80
, но так как вы сказали программу на языке Си, вы называете это? Если это так, вам необходимоpop ebp
до вашегоret
Ответ №1:
Я получаю ошибку сегментации (дамп ядра) при нажатии ebp в стеке. Это почему? Я запускаю этот код на виртуальной машине Ubuntu. Забавно, что иногда я получаю ошибку «незаконная инструкция».
Я бы поспорил , что вы получаете ошибку не в сегментации push
, а скорее в ret
. Что ret
делает инструкция, так это извлекает обратный адрес из стека (который обычно был помещен туда call
инструкцией) и переходит к нему.
Поэтому, когда вы делаете это:
push ebp
ret
Вы фактически переходите на любой адрес, в котором он был сохранен ebp
.
вам нужно сбалансировать стек перед возвращением, т. Е. Каждая инструкция push — типа должна иметь соответствующую инструкцию pop-типа:
push ebp
; ... other code goes here ...
pop ebp
ret