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

О проекте

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

MySQL

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

Хостинг

Другое








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

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

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

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

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

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

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

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

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

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

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

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






 
 
| Добавить в избранное | Сделать стартовой 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