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

О проекте

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

MySQL

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

Хостинг

Другое








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

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

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

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

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

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

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

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

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

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

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

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






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



Наращивание ресниц - ресницамания блог о ресницах veran-lash.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