Наращивание ресниц - ресницамания блог о ресницах veran-lash.ru.
Возврат
Выход из функции происходит в два шага. Во-первых, окружение, созданное для
функции, должно быть удалено (т.е. надо вернуть %ebp и
%eip значения, бывшие до вызова функции). Сделав это, мы должны
проверить стек, чтобы получить информацию, относящуюся к функции, из которой мы
только что вышли.
Первый шаг делается в функции инструкциями:
leave
ret
Следующий - делается в функции, из которой происходил вызов, и состоит в
удалении из стека аргументов вызываемой функции.
Здесь мы описываем начальную ситуацию до вызова и пролога. Перед
вызовом %ebp содержал адрес X, а
%esp - Y. >Далее мы сохранили в стеке
аргументы функции, %eip и %ebp и зарезервировали
место для наших локальных переменных. Следующей выполненной инструкцией
будет leave.
Инструкция leave эквивалентна последовательности:
mov ebp esp
pop ebp
Первая инструкция опять делает так, что
%esp и %ebp указывают на одно и то же место в
стеке. Вторая - помещает вершину стека в регистр %ebp. Всего
одной инструкцией (leave) стек возвращается в состояние как
до пролога.
Инструкция ret восстанавливает %eip, таким
образом продолжается выполнение вызывающей функции с нужного места, то
есть после функции, из которой мы вышли. Для этого достаточно поместить
значение с вершины стека в %eip.
Мы еще не вернулись к начальной ситуации, так как в стеке все еще
находятся аргументы функции. Удаление их будет следующей инструкцией,
которая представлена своим адресом Z+5 в %eip
(заметьте, что адресация инструкций растет, в противоположность тому, что
происходит в стеке).
Удаление параметров из стека производится вызывающей функцией, поэтому
сейчас время это сделать. Процесс проиллюстрирован на диаграмме напротив,
с разделителем между инструкциями в вызываемой функции и add 0x8,
%esp в вызывающей. Эта инструкция возвращает %esp выше
по стеку на столько байт, сколько использовали параметры функции
toto(). Регистры %ebp и %esp
находятся теперь в ситуации, в которой они были до вызова. С другой
стороны регистр инструкции %eip продвинулся выше.