Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекцій із Системного програмування та...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
786.31 Кб
Скачать

1. Стек

У ПК є спеціальні команди роботи зі стеком, тобто областю пам'яті, доступ до елементів якої здійснюється за принципом "останнім записаний - першим прочитаний". Але для того, щоб можна було скористатися цими командами, необхідне дотримання ряду умов.

Під стек можна відвести область у будь-якому місці пам'яті. Розмір її може бути будь-яким, але не повинен перевершувати 64Кб, а її початкова адреса повинна бути кратним 16. Інакше кажучи, ця область повинна бути сегментом пам'яті; вона називається сегментом стека. Початок цього сегмента (перші 16 біт початкової адреси) повинен обов'язково зберігатися в сегментному регістрі SS.

Збережені в стеці елементи можуть мати будь-який розмір, однак треба ураховувати, що в ПК є команди запису в стек і читання з нього тільки слів. Тому для запису байта в стек його треба попередньо розширити до слова, а запис або читання подвійних слів здійснюються парою команд.

У ПК прийнято заповнювати стек знизу нагору, від більших адрес до менших: перший елемент записується в кінець області, відведеної під стек, другий елемент - у попередній осередок області й т.д. Зчитується завжди елемент, записаний у стек останнім. У зв'язку з цим нижня границя стека завжди фіксована, а верхня - змінюється. Слово в пам'яті, у якому перебуває елемент стека, записане останнім, називається вершиною стека. Адреса вершини, відлічена від початку сегмента стека, зобов'язаний перебувати в покажчику стека - регістра SP. Таким чином, абсолютна адреса вершини стека визначається парою SS:SP.

-і-і- -і-і- -і-і-

SS:SP | | SS:SP | | SS:SP | |

| -і-і- запис | -і-і- читання | -і-і-

| | | =======> -і-і>| b | =======> | | |

| -і-і- у стек -і-і- зі стека | -і-і-

-і-і->| a | | a | -і-і>| a |

-і-і- -і-і- -і-і-

Значення 0 у регістрі SP свідчить про те, що стек повністю заповнений (його вершина "дійшла" до початку області стека). Тому для контролю за переповненням стека треба перед новим записом у стек провіряти умову SP=0 (сам ПК цього не робить). Для порожнього стека значення SP повинне рівнятися розміру стека, тобто пари SS:SP повинна вказувати на байт, що випливає за останнім байтом області стека. Контроль за читанням з порожнього стека, якщо треба, зобов'язана робити сама програма.

Початкова установка регістрів SS й SP може бути зроблена в самій програмі, однак в MASM передбачена можливість автоматичного завантаження цих регістрів. Якщо в директиві SEGMENT, що починає опис сегмента стека, указати параметр STACK, тоді асемблер (точніше, завантажник) перед тим, як передати керування на першу команду машинної програми, завантажить у регістри SS й SP потрібні значення. Наприклад, якщо у програмі сегмент стека описаний в такий спосіб:

ST SEGMENT STACK

DB 256 DUP(?) ;розмір стека - 256 байтів

ST ENDS

і якщо під цей сегмент була виділена область пам'яті починаючи з абсолютної адреси 12340h, тоді до початку виконання програми в регістрі SS виявиться величина 1234h, а в регістрі SP - величина 100h (=256). Відзначимо, що ці значення відповідають порожньому стеку.