Операции со
стеком поддерживаются тремя регистрами:
1.
Регистр сегмента
стека (SS). Стеки размещаются в памяти. количество стеков в системе ограничивается
только максимальным числом сегментов. Размер стека не может превышать 4 Гбайт,
что соответствует максимальному размеру сегмента для процессора i486. В каждый
момент времени доступен только один стек - стек, селектор сегмента которого
содержится в регистре SS. Этот стек называется текущим, однако далее слово
"текущий" будет, как правило, опускаться, а текущий стек будет
называться просто "стеком". Регистр SS автоматически используется
процессором для выполнения всех операций со стеком.
2.
Регистр
указателя стека (ESP). В регистре ESP содержится относительный адрес вершины
стека в текущем сегменте стека. Его значение используется командами POP и PUSH,
при вызове подпрограмм и при возврате, исключениями и прерываниями. При
занесении элемента в стек (смотри Рис. 12), процессор уменьшает значение
регистра ESP, а затем записывает элемент по адресу новой вершины. При
извлечении данных из стека, процессор копирует элемент, расположенный по адресу
вершины, а затем увеличивает значение регистра указателя стека. Иными словами,
стек растет вниз, в сторону уменьшения адресов.

Рис. 12 Стеки
3.
Регистр
указателя базы кадра стека (EBP). Данный регистр, как правило, используется для
доступа к структурам данных, содержащимся в стеке. Например, при входе в
подпрограмму, стек содержит адрес возврата и некоторое число параметров,
передаваемых в данную подпрограмму. Подпрограмма, при необходимости создания
временных локальных переменных, использует стек, что приводит к изменению
указателя стека по мере занесения и удаления данных в стеке. Если перед началом
выполнения операций со стеком указатель стека копируется в базовый указатель
кадра стека, последний может быть использован для доступа к данным, имеющим
фиксированное смещение в сегменте стека. Если этого не делать, доступ к
структурам данных, имеющим фиксированное смещение, может быть утерян в процессе
занесения в стек и удаления из стека временных переменных. При использование
регистра EBP для хранения адреса пямяти, текущий сегмент обязательно должен
быть выбран (установлен регистр SS). Т.к. нет необходимости указывать сегмент
стека в каждой команде, их кодирование становится более компактным. Регистр EBP
может также использоваться для адресации других сегментов. Такие команды как
ENTER и LEAVE предусматривают автоматическое использование регистра EBP для
обеспечения удобного доступа к переменным.