Регистр указателя стека  (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  и системы  вместе с обычными запросами самой программы.