П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 178297 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 75765 раз(а).

Учебник HTML.
Просмотров 74200 раз(а).

Руководство по PHP5.
Просмотров 45147 раз(а).

Хостинг через призму DNS.
Просмотров 52090 раз(а).

Подборка текстов стандартных документов.
Просмотров 45220 раз(а).

Учебник PHP - Самоучитель
Просмотров 51452 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 51913 раз(а).

Внешние атаки...
Просмотров 42021 раз(а).

Учебник PHP.
Просмотров 37395 раз(а).

SSI в примерах.
Просмотров 27904 раз(а).






 
 
| Добавить в избранное | Сделать стартовой Project.Net.Ru | Помощь





Возврат

Выход из функции происходит в два шага. Во-первых, окружение, созданное для функции, должно быть удалено (т.е. надо вернуть %ebp и %eip значения, бывшие до вызова функции). Сделав это, мы должны проверить стек, чтобы получить информацию, относящуюся к функции, из которой мы только что вышли.

Первый шаг делается в функции инструкциями:

leave
ret

Следующий - делается в функции, из которой происходил вызов, и состоит в удалении из стека аргументов вызываемой функции.

Закончим предыдущий пример с функцией toto().

Диаграмма 3: Выход из функции
начальная ситуация Здесь мы описываем начальную ситуацию до вызова и пролога. Перед вызовом %ebp содержал адрес X, а %esp - Y. >Далее мы сохранили в стеке аргументы функции, %eip и %ebp и зарезервировали место для наших локальных переменных. Следующей выполненной инструкцией будет leave.
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 продвинулся выше.

Назад | Содержание | Вперед



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru