Владимир Мешков
Предпримем попытку систематизировать собственные знания о стеке и
максимально подробно рассмотрим, какую роль играет стек в процедурном
программировании.
Стек – это область памяти, предназначенная для временного хранения данных.
Стек адресуется при помощи пары регистров SS:ESP. Регистр SS (Stack Segment)
содержит селектор сегмента стека при работе процессора в защищенном режиме, ESP
(Stack Pointer, указатель стека) – смещение относительно базового адреса
сегмента стека. Упрощенная схема адресации данных в стеке, без привязки к
какой-либо конкретной операционной системе, показана на рис. 1. Схема адресации
сегментов команд и данных идентична изображенной на рисунке схеме адресации
сегмента стека. При подготовке статьи использовались ОС Linux, компилятор
gcc-4.1.2, отладчик gdb-6.6.

Рисунок 1. Адресация стека
Для помещения данных в стек и извлечения данных
из него используются инструкции процессора push и pop. Стек работает по
принципу FILO (First Input – Last Output, первым вошел – последним вышел).
Каждый вызов инструкции push/pop изменяет значение регистра ESP. Инструкция push
размещает данные по адресу, на который указывает ESP, и сдвигает
верхушку стека в сторону младших адресов, уменьшая значение ESP. Инструкция pop
поступает наоборот – снимает данные с верхушки стека и увеличивает значение
ESP.