Работа со стеком
Стек — это область памяти, специально выделяемая для временного хранения дан-
ных программы. Важность стека определяется тем, что для него в структуре про-
граммы предусмотрен отдельный сегмент.
тот случай, если программист забыл
описать сегмент стека в своей программе, компоновщик
выдаст предупрежда-
ющее сообщение.
Для работы со стеком предназначены три регистра:
И SS — регистр сегмента стека;
SP/ESP — регистр указателя стека;
ВР/ЕВР — регистр указателя базы кадра стека.
Размер стека зависит от режима работы процессора и ограничивается значени-
ем 64 Кбайт (или 4 Гбайт в защищенном режиме). В каждый момент времени дос-
тупен только один стек, адрес сегмента которого содержится в регистре SS. Этот
стек называется текущим. Для того чтобы обратиться к другому стеку
чить стек»), необходимо загрузить в регистр другой адрес. Регистр SS автомати-
чески используется процессором для выполнения всех команд, работающих со сте-
ком.
Перечислим еще некоторые особенности работы со стеком.
• Запись и чтение данных в стеке осуществляются в соответствии с принципом
(Last In First Out — «последним пришел, первым
* По мере записи данных в стек последний растет в сторону младших адресов.
Эта особенность заложена в алгоритм команд работы со стеком.
и При использовании регистров ESP/SP и ЕВР/ВР для адресации памяти ассемб-
лер автоматически считает, что содержащиеся в нем значения представляют
собой смещения относительно сегментного регистра SS.
Работа со стеком
Оперативная память
0000:0000
ss:sp
Сегмент кода
Сегмент данных
Сегмент стека
Вершина стека
Дно стека
Направление
роста стека
Старшие адреса
Рис. 7.3. Концептуальная схема организации стека
В общем случае стек организован
как показано на рис. 7.3.
Регистры SS, ESP/SP и
используются комплексно, и каждый из них
ет свое функциональное назначение. Регистр ESP/SP всегда указывает на вершину
стека, то есть содержит смещение, по которому в стек был занесен последний эле-
мент. Команды работы со стеком неявно изменяют этот регистр так, чтобы он ука-
зывал всегда на последний записанный в стек элемент. Если стек пуст, то значение
ESP равно адресу последнего байта сегмента, выделенного под стек. При занесении
элемента в стек процессор уменьшает значение регистра ESP, а затем записывает
элемент по адресу новой вершины. При извлечении данных из стека процессор
копирует элемент, расположенный по адресу вершины, а затем увеличивает значе-
ние регистра указателя стека ESP. Таким образом, получается, что стек растет вниз,
в сторону уменьшения адресов.
Что нужно сделать для получения доступа к элементам не на вершине, а внутри
стека? Для этого применяют регистр ЕВР. Регистр ЕВР — регистр указателя базы
кадра стека. Например, типичным приемом при входе в подпрограмму является
передача нужных параметров путем записи их в стек. Если подпрограмма тоже
активно работает со стеком, то доступ к этим параметрам становится проблема-
тичным. Выход в том, чтобы после записи нужных данных в стек сохранить адрес
вершины стека в указателе базы кадра стека — регистре ЕВР. Значение в ЕВР в даль-
нейшем можно использовать для доступа к переданным параметрам.
Начало стека расположено в старших адресах памяти. На рис. 7.3 этот адрес
обозначен парой
Смещение
приведено здесь условно. Реально это значе-
ние определяется величиной, которую программист задает при описании сегмента
стека в своей программе. К примеру, для программы из листинга
началу стека
будет соответствовать пара
Адресная пара
— это
для
реального режима значение адреса начала стека, так как размер сегмента в нем
ограничен величиной 64 Кбайт
Какой из регистров применяется для адресации, 32-разрядный или 16-разрядный, зависит от значе-
модификатора
или
в директиве сегментации segment (см. главу 5). При наличии ди-
ректив упрощенного описания сегментов модификаторы
или use32 используются в
model.
б
256
Глава 7. Команды обмена
Для организации работы со стеком существуют специальные команды записи
и чтения.
Команда PUSH выполняет запись значения
в вершину стека:
push
Интерес представляет алгоритм работы этой команды, который включает два
действия (рис. 7.4):
1. Значение SP уменьшается на 2:
(SP) = (SP) - 2
2. Значение источника записывается по адресу, указываемому парой SS:SP.
Оперативная память
Оперативная память
0000:0000
ss:sp
Сегмент стека
Вершина стека
Дно стека
ss:sp
Т
Сегмент стека
Операнд
Старая вершина стека
Дно стека
Старшие адреса
до команды
PUSH операнд
Старшие адреса ОП
после команды
PUSH операнд
Do'stlaringiz bilan baham: |