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

О проекте

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 | Помощь



http://lb-total.ru/ ящики для холодильников liebherr либхер.


Пролог

Функция всегда начинается с инструкций:
push   %ebp
mov    %esp,%ebp
push   $0xc,%esp       //$0xc зависит от программы

Эти три инструкции делают то, что называется пролог. Диаграмма 1 детализирует работу пролога функции toto(), поясняя роли регистров %ebp и %esp:

Диаграмма 1: пролог функции
пролог Вначале, %ebp указывает на некоторый адрес X в памяти. %esp ниже в стеке на адресе Y и указывает на последний элемент в нем. При входе в функцию, вы должны сохранить начало "текущего окружения", на которое указывает %ebp. Т.к. %ebp помещается в стек, %esp увеличивается на размер слова.
окружение Вторая инструкция позволяет построить новое "окружение" для функции, %ebp теперь указывает на вершину стека. Поэтому %ebp и %esp указывают на одно и то же слово в памяти, которое содержит адрес предыдущего окружения.
место в стеке для локальных переменных Теперь должно быть выделено место в стеке для локальных переменных. Массив символов определен состоящим из 5 элементов и требует для размещения 5 байт (char занимает один байт). Однако стек работает только со словами и может выделять память только кратную слову(одно слово, 2 слова, 3 слова, ...). Чтобы сохранить 5 байт в случае четырехбайтного слова, вам нужно использовать 8 байт (что есть 2 слова). Серая часть может быть использована, даже если она не является частью строки. Целое k занимает 4 байта. Это место резервируется увелечением значения %esp на 0xc (шеснадцатиричное 12). Локальные переменные используют 8+4=12 байт (т.е. 3 слова).

Кроме самого механизма действия, важная вещь, которую надо здесь запомнить, - это расположение локальных переменных: локальные переменные имеют отрицательное смещение по отношению к %ebp. Инструкция i=0 в функции main() показывает это. Ассемблерный код (сравните ниже) использует косвенную адресацию для доступа к переменной i:


0x8048411 <main+25>:    movl   $0x0,0xfffffffc(%ebp)

Шеснадцатиричное 0xfffffffc представляет целое -4. Запись означает: поместить значение 0 в переменную, отстоящую на "-4 байта" по отношению к регистру %ebp. i - первая и единственная локальная переменная в функции main(), поэтому ее адрес - 4 байта (т.е. размер целого) "ниже" регистра %ebp.

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



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





Copyright © 2005-2016 Project.Net.Ru