Регистр указателя стека (SP) - это 16-битовый регистр, который
определяет текущее смещение вершины стека. Процессор использует
указатель стека совместно с регистром сегмента стека для формирова-
ния физического адреса. Процессор использует пару регистров SS:SP
для всех стековых ссылок, включая PUSH, POP, CALL и RETURN. Пара
SS:SP всегда указывает текущую вершину стека. Когда команда
помещает в стек слово, регистр SP уменьшается на два. При извлече-
нии из стека слова процессор увеличивает регистр SP на два. Стек
растет в направлении меньших адресов памяти. Все стековые опера-
ции используют значения размером в слово. Отдельный байт не может
быть ни помещен в стек ни взят из него.
Процессор изменяет регистр SP для того чтобы отразить действия
над стеком. На регистр SS ни одна из стековых операций не влияет.
Программа устанавливает регистр SS независимо от какой либо опера-
ции PUSH (поместить в стек) или POP (извлечь), после чего он
указывает на сегмент стека. Это означает, что системный стек
ограничен в размере 64 килобайтами. Например, если программа
устанавливает регистр SS в 1000H, а регистр SP - на 0, то первое,
что будет помещено в стек, разместится по адресам 1000:FFFFH и
1000:FFFEH. Последовательно помещаемые в стек данные будут
размещаться в нем по все более младшим адресам, пока последий
объект не будет расположен в 1000:0001H и 1000:0000H. Если
программа поместит в стек в этот момент еще что-нибудь, то оно
разместится в 1000:FFFFH и 1000:FFFEH, то есть в первых байтах
используемых стеком. Поскольку стек теперь "замкнулся", ранее
помещенные в него данные разрушены.
При нормальном использовании длина стека не достигает 64K. Если
программа устанавливает стек в 512 байт, например, то она может
инициализировать пару SS:SP как 1000:2000H. Первая ячейка стека
будет 1000:01FFH, а последняя доступная - 1000:0000H. Если програм-
ма поместит в стек более 256 слов, уменьшение регистра SP вызовет
проход его значения через нуль и приведет к размещению данных
сначала сегмента стека. После этого программа будет помещать
стековые данные в область, которая в данном случае не
предназначалась для стека - начиная с 1000:FFFFH. При этом может
произойти одна из двух неприятных вещей. Стек может перекрыть коды
- 49 -
или данные программы и разрушить их, либо стековые данные будут
направляться в пространство, которое не имеет физической памяти.
Любую из этих вещей очень трудно обнаружить при отладке программы,
поэтому единственный выход - оставлять для стека как можно больше
места. В случае персонального компьютера IBM, использующего
дисковую операционную систему IBM рекомендуется размер стека не
меньше 128 байт. Это дает достаточно места для удовлетворения
потребностей в стеке различных служебных программ DOS и системы
вместе с обычными запросами самой программы.