Как было упомянуто ранее, стек позволяет решить многие задачи. Во-первых, обеспечить локальное хранение переменных и данных функции. Во-вторых, передавать параметры в вызываемую функцию. В этой части главы будет рассказано, как компиляторы передают параметры вызываемым функциям и как это влияет на стек. Кроме того, будет уделено внимание разъяснению вопросов использования стека в командах процессора вызов функции
Основные сведения
Стековый фрейм функции
Для того чтобы понять, как работает стек, следует немного знать о командах процессора Intel
1) проталкивает в стек адрес следующей команды, который является адресом точки возврата – точки, куда процессор передаст управление (возвратится) после выполнения функции;
2) передает управление по указанному в команде
А команда
1) извлекает из стека сохраненный адрес точки возврата;
2) передает управление по только что извлеченному из стека адресу точки возврата.
Комбинация этих двух команд позволяет легко организовать передачу управления командам функции и вернуться обратно по ее завершении. Кроме того, благодаря сохраненному в стеке содержимому регистра EIP всегда можно прочитать из стека адрес точки перехода. После изучения принципов работы фреймового стека функции об этом будет сказано подробнее.
Передача параметров в функцию. Простой пример
В разделе приведен пример простой программы, иллюстрирующий использование фреймового стека функции для передачи параметров функции. В программе создаются несколько локальных переменных, инициализируется и вызывается функция
На рисунке 8.4 приведена программа, которая поясняет структуру фреймового стека функции и его использование в командах
Рис. 8.4. Пример программы, демонстрирующей использование стека в командах вызова и возврата
Дизассемблирование
Приведенная на рис. 8.4 программа была скомпилирована как консольное приложение Windows в режиме построения окончательной версии Release. Результаты дизассемблирования функций