Ошибка сегментации при нажатии на стек (NASM)

# #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