Команды управления стеком
Часто в ходе выполнения процессором какой-то последовательности основных действий возникает необходимость переключиться на выполнение другой последовательности действий, а выполнив её снова вернуться к продолжению основной последовательности действий. Успешная реализация такого рода переключений предполагает наличие возможности сохранения в памяти состояния регистров процессора на момент использования этих регистров в действиях, на которые выполнено переключение. Сохранение необходимо для того, чтобы сначала вернуть сохранённое состояние регистров назад в процессор, а затем только вернуться к продолжению основных действий.
Часто в ходе выполнения процессором какой-то основной программы возникает необходимость переключаться на выполнение разных подпрограмм, а выполнив их снова возвращаться к продолжению основной программы (см. пример на рис.8.1). Успешная реализация такого рода переключений предполагает наличие возможности сохранения в памяти состояния регистров процессора на момент использования этих регистров в подпрограммах.
Сохранение необходимо для того, чтобы сначала вернуть сохранённое состояние регистров назад в процессор, а только затем вернуться к продолжению основных действий.
Эффективными такие действия могут быть только в том случае, если можно будет быстро сохранять в памяти и возвращать назад состояния регистров. Это возможно если организовать взаимодействие с памятью не обычным образом, как это делается в командах пересылок, по принципу стека.
Стеком называется структура данных, в которой новый элемент всегда записывается в её начало (вершину) и очередной читаемый элемент также всегда выбирается из её начала. Примером стека может служить магазин пистолета.
Структура данных стекового типа организуется в оперативной памяти. Начало области стека (вершина стека) определяется через адрес, который процессор хранит всегда в своём регистре SP, который поэтому называется указателем стека. Механизм взаимодействия процессора со стеком предполагает автоматическое изменение адреса в SP при каждом очередном обращении процессора к стеку: при записи в стек очередного байта происходит автоматический декремент указателя стека, а при чтении из стека очередного байта происходит автоматический инкремент указателя стека. За счёт того, что адрес памяти при стековых операциях формировать не приходится (он всегда имеется в регистре SP) время обращения к памяти сильно сокращается по сравнению с обычными операциями.
Для организации стековых операций в системе команд процессора 8080 имеются команды
· инициализации стека,
· записи в стек,
· чтения стека,
· обмена стека с регистровой парой HL.
Инициализация стека заключается в исходной установке его вершины, то есть в загрузке адреса в регистр указателя стека SP. Она может быть выполнена одной из двух команд. Либо при помощи команды двухбайтной пересылки LXI SP,d16, представленной в группе команд пересылок. В этой команде вершина стека определяется непосредственно числом d16, которое является её адресом. Другой способ инициализации стека обеспечивается командой SPHL, которая загружает указатель стека содержимым регистровой пары HL:
(SP)(HL)
Команды записи в стек – PUSH B, PUSH D, PUSH H, PUSH PSW. Они обеспечивают запись в стек последовательно двух байт из выбираемых командами регистровых пар.
Одной из пар в данном случае может быть пара, именуемая в мнемонике PSW (Processor Status Word) и состоящая из аккумулятора A (в качестве младшего регистра в паре) и регистра признаков F. Общая схема выполнения команд записи из регистровой пары rp в стек: stack(rp). При выполнении команд происходят последовательно следующие операции:
1. Декремент регистра SP для продвижения по стеку вперёд: (SP)(SP)–1
2. Запись в стек байта старшего регистра: M(SP)старший регистр
3. Декремент регистра SP для продвижения по стеку вперёд: (SP)(SP)–1
4. Запись в стек байта младшего регистра: M(SP)младший регистр
В результате после выполнения команды адрес в указателе стека уменьшается на 2, и вершина стека сдвигается в сторону младших адресов.
Команды чтения стека – POP B, POP D, POP H, POP PSW. Они обеспечивают возврат из стека в выбираемую командами регистровую пару того, что туда отправлялось командами записи. При выполнении команд происходят последовательно следующие операции:
1. Чтение байта из стека в младший регистр: M(SP)® младший регистр
2. Инкремент регистра для продвижения по стеку назад: SP (SP)(SP)+1
3. Чтение байта из стека в старший регистр: M(SP)® старший регистр
4. Инкремент регистра для продвижения по стеку назад: (SP)(SP)+1
В результате после выполнения команды адрес в указателе стека увеличивается на 2, и вершина стека сдвигается в сторону старших адресов.
Команда XTHL обеспечивает обмен двухбайтными операндами. Первый операнд читается из вершины стека, а второй операнд берётся из регистровой пары HL:(HL)«stack. В результате данной операции содержимое регистра SP остаётся без изменений. По своему формату команда является однобайтной. Поэтому фаза выборки команды займёт всего один машинный цикл. Зато для фазы выполнения потребуется четыре машинных цикла: сначала – на два чтения из стека, затем на две записи в стек. И в целом, данная команда оказывается самой продолжительной по времени среди всех возможных команд. На её выполнение процессор затрачивает 18 машинных тактов.
Далее показан пример, иллюстрирующий применение команд управления стеком для организации переключений между основной программой и подпрограммой TIX.
Пример1.50
Метка Мнемокод Комментарий
;******************** Основная программа
LXI SP,1FFFh ; Установка вершины стека
…………………………….
LXI B,03E8h ; Определение задержки – 1с (3E8h=1000мс)
CALL TIX ; Вызов подпрограммы временной задержки
MOV B,A ; продолжение основной программы
…………………………….
;
;******************** Подпрограмма временной задержки
; Вход: BC – интервал временной задержки в мс
TIX: PUSH B ; сохранение в стеке (BC)
TI2: PUSH PSW ; сохранение в стеке (A)&(F)
PUSH D ;сохранение в стеке (DE)
; ******************** Организация цикла программной паузы
XRA A
TI1: MVI D,80
TI0: DCR D
JNZ TI0
DCX B ; BC=BC–1
CMP B
JNZ TI1
;*********************
POP D ; чтение из стека в (DE)
POP PSW ; чтение из стека в (A)&(F)
POP B ; чтение из стека в (BC)
RET ;возврат из подпрограммы