Стек – область памяти, специально выделяемая для временного хранения данных программы. Для работы со стеком предназначены три регистра:
SS – регистр сегмента стека;
SP – регистр указателя стека;
BP – регистр указателя базы кадра стека
Стеков может быть несколько. В постоянный момент времени доступен только один стек, адрес сегмента которого содержится в регистре SS. Для обращения к другому стеку в регистр SS можно загрузить его адрес.
Особенности работы со стеком.
Запись и чтение данных в стеке осуществляется по принципу LIFO
0000.0000 | ||
Сегмент кода | ||
Сегмент данных | ||
Сегмент стека | ||
Вершина стека | SS:SP | |
Дно стека | SS:ffff |
По мере записи в стек области данных, он растет в сторону младших адресов. При использовании регистров SP и BP для адресации памяти, Assembler автоматически считает, что содержащиеся в нем значения представляют собой смещение относительно сегментного регистра SS. Регистр SP указывает на вершину стека, т.е. содержит смещение, по которому в стек был записан последний элемент. При записи элементов в стек, процессор сначала уменьшает значение SP, а затем записывает элемент по адресу новой вершины. При извлечении данных из стека процессор копирует элемент, расположенный по адресу вершины, затем увеличивает значение регистра указателя стека SP.
Для доступа к элементам внутри стека используют регистр BP.
Для организации работы со стеком существуют специальные команды записи и чтения:
1. push <источник> (ax)
Алгоритм работы:
1. Уменьшает SP на 2
2. Значение источника записывается по адресу, указываемого парой SS:SP
2. pop <приемник>
Выполняет запись из вершин стека по адресу, указанного приемником.
Алгоритм работы:
1. Запись содержимого в вершину стека по месту указываемого приемником
2. Увеличение SP на 2
Основные виды операций, использующие стек: вызов подпрограмм, временное сохранение значений регистров, определение локальных переменных в процедуре