Зависает программа без ошибки

Компилятор: FASM Опции ассемблера: $SOURCE$ $PROGRAM.OBJ$ -s $LSTOUTPUT$ Опции компоновщика: $PROGRAM.OBJ$ $MACRO.OBJ$ -g -o $PROGRAM$ -m32

format ELF

section '.text' executable
public _main
_main:
    push ebp
    mov ebp, esp
    ret

Данный кусок кода, зависает. Хотя тут ничего толком не происходит. Если убрать push ebp - все будет хорошо. Почему оно так?


Ответы (1 шт):

Автор решения: LShadow77

Если в процедуре есть пролог

push    ebp            ;сохраняем базу предыдущего фрейма
mov     ebp,esp        ;записываем базу нового фрейма
sub     esp,vars_size  ;резервируем фрейм локальных переменных (если они есть)

то, соответственно, должен быть и эпилог

mov     esp,ebp        ;возвращяем указатель стека к сохранённой старой базе
pop     ebp            ;восстанавливаем старую базу

Если у вас EBP/ESP не меняются (например, когда нет локальных переменных и переданных параметров), то и пролог/эпилог не нужен. В процедуре, которая ничего не делает достаточно всего лишь одной инструкции - ret.

→ Ссылка