Стек – особый вид оперативной памяти, отличающийся последовательным способом организации доступа к ней.
Стек – это область памяти, в которой временно сохраняется информация, необходимая для осуществления возврата в программу после выполнения подпрограммы. Стек также используется для временного сохранения любых данных при нехватке внутренних регистров МП.
Стек играет огромную роль при обработке прерываний. Реагируя на внешние или внутренние прерывания, МП должен переключиться с текущей программы на другую программу, называемую обработчиком прерывания. Однако после обслуживания прерываний необходимо продолжить выполнения основной программы, для которой в стеке временно сохраняется содержимое используемых обработчиком прерывания регистров МП на время его работы.
Состояние стека отображается во внутреннем 16-битном регистре SP – указателе стека, который содержит адрес вершины стека.
В типовых МП фактическое положение стека в ОЗУ определяется программистом. До использования стека необходимо инициализировать SP командой LXI SP на максимальный адрес области (вершину), выделяемой для стека.
Стек функционирует как память с последовательным доступом по типу данные, поступившие последними, извлекаются первыми (тип LIFO от LAST IN - FIRST OUT – последний входит - первый выходит или FILO от FIRST IN - LAST OUT – первый входит - последний выходит).
Содержимое любого регистра МП можно поместить в стек с помощью команды PUSH, а из стека можно извлечь командой POP последние включенные в него данные регистра МП. Обе стековые операции выполняются с 16-битовым словами, т.е. в стек можно включать только содержимое регистровых пар и извлекать из стека можно только регистровые пары.
Извлечение из стека не разрушает в памяти считываемые данные и, произведя специальными командами декремент SP на 2, можно вновь извлечь из стека ранее считываемые данные. При программировании надо следить за использованием стека, в частности, каждой команде PUSH должна соответствовать команда POP.
В Intel 8080 есть специфическая 1-байтная команда XTHG, которая производит обмен содержимого регистров H, L и двух верхних ячеек стека, т.е. последних загруженных в стек данных, при этом значение SP не изменяется.
К особенностям микропроцессора Intel 8080 относится однобайтная команда SPHL передачи 16-битных данных регистра HL в указатель стека.
Следует отметить, что команда CALL сочетает функции операций перехода и загрузки в стек. Адрес перехода к подпрограмме зафиксирован во втором и третьем байте команды CALL, а адрес следующей команды за CALL отправляется в стек. После завершения выполнения подпрограммы команда RET извлекает из стека адрес следующей команды основной программы и загружает его в счетчик команд PC.
Основным достоинством стека является то, что можно заносить в него данные (увеличивать емкость стека), не разрушая структуру уже записанных в нем данных. Если же данные запоминаются в ячейках памяти или в регистре, то теряется предыдущее содержимое этого участка памяти. Кроме того, МП может быстро передавать данные в стек и из стека, т.к. адрес содержится в указателе стека, а не является частью команды. Формат команд операций со стеком очень короткий.
Однако микропроцессор Intel 8080 не имеет никаких средств аппаратного контроля за поведением стека. Ошибки при работе со стеком приводят к двум ситуациям:
1. Переполнение стека – указатель стека достиг верхней границы области стека и делается попытка произвести дополнительное включение в стек;
2. Антипереполнение стека – указатель стека находится на нижней границе области стека и делается еще одна попытка извлечения из стека.
Возникновение любой из этих ситуаций ведет к тому, что поведение системы становится непредсказуемым.