Предыдущий раздел СПИСКИ И ПРОЦЕДУРЫ Следующий раздел

7.3. Программные стеки

В принципе программа может обрабатывать любые списки, но несвязанный стек – единственный вид списков, для работы с которым ЦП имеет специальные регистры и машинные команды.

Допустим, что для нашей программы операционная система (ОС) выделила область (сегмент) ОП, начиная с параграфа 20h (рис.27). Регистр CS содержит число 20h и представляет собой указатель на начало этой области. Одновременно с назначением области ОП для размещения программы ОС назначает сегмент для размещения стека, который будет обслуживать нашу программу и который поэтому называется программным стеком.

 

Рис. 27. Пример размещения программы в ОП

 

Где находится стек в ОП? Для того, чтобы выполнять операции со стеком, достаточно знать адрес в памяти вершины стека. Этот адрес всегда содержится в паре регистров: 1) регистр сегмента стека – SS;  2) указатель стека – SP (от "Stack Pointer" – указатель стека). Реальный адрес ячейки, являющейся вершиной стека, получается аппаратно путем суммирования содержимого SS, умноженного на 16, с содержимым SP.

Содержимое регистров SS и SP вы многократно наблюдали ранее, получая  листинг регистров по команде R или какой-то другой команде Debug. Первоначальную запись в данные регистры выполняет DOS, руководствуясь следующим. Во-первых, в SS записывается тот же номер параграфа, что и в регистр сегмента кодов CS. Это означает, что для стека отводится тот же сегмент ОП, что и для программы (см. рис.27).

Первоначально в указатель стека DOS записывает максимально возможное число без знака (FFFF) или чуть меньшее число, в результате чего вершиной стека является последняя ячейка сегмента стека (и сегмента программы), называемая "дном" стека.  "Растет" стек в отличие от программы в сторону не больших, а меньших адресов. При добавлении слова данных в стек содержимое SP уменьшается на 2, а при исключении слова из стека – увеличивается на 2.

Программа может выполнить включение слова данных в стек, используя машинную команду “push b”, где b - адрес ячейки памяти (ОП или регистровой памяти), содержимое которой следует включить в стек. Исключение слова данных из стека выполняет команда “pop b”, где b - адрес ячейки памяти, в которую следует считать слово данных из стека.

П р о в е р ь т е  с помощью команды R Debug содержимое регистров SS и SP. Выполните команды “push ax” и “pop ax”, наблюдая за содержимым регистра SP.

В заключение заметим, что многоцелевое использование одного и того же стека делает необходимым повышенное внимание при работе с ним: каждое записанное в стек слово должно быть вовремя извлечено оттуда.

 


Предыдущий раздел В начало Следующий раздел