Инструкции PUSH и POPВ микропроцессоре 8085 инструкции PUSH и POP используются для работы со стеком. Стек — это структура данных «первым пришёл — последним ушёл» (LIFO) в памяти, которая играет важную роль в обработке подпрограмм, прерываний и сохранении значений регистров во время выполнения программы.
Общий формат PUSH — PUSH RP, где RP представляет собой пару регистров. В 8085 допустимыми парами регистров для PUSH являются BC, DE, HL и PSW (слово состояния программы, которое содержит значения регистров накопителя и флага).
Для каждой пары регистров существуют определённые коды операций:
- PUSH B помещает содержимое пары регистров BC в стек.
- PUSH D помещает содержимое пары регистров DE в стек.
- PUSH H помещает содержимое пары регистров HL в стек.
- PUSH PSW помещает содержимое слова состояния программы (аккумулятора и флагов) в стек.
Общий формат инструкции POP — POP RP, где RP представляет собой пару регистров. Как и в случае с инструкцией PUSH, допустимыми парами регистров являются BC, DE, HL и PSW.
Для каждой пары регистров существуют определённые коды операций:
- POP B извлекает содержимое из стека в пару регистров BC.
- POP D извлекает содержимое из стека в пару регистров DE.
- POP H извлекает содержимое из стека в пару регистров HL.
- POP PSW помещает содержимое стека в слово состояния программы (обновляя аккумулятор и флаги).
В следующем примере мы напишем функцию которая будет копировать элементы массива src в массив dst.
- ; Автор: Довгополов Евгений Сергеевич
- src: db 01h, 02h, 03h, 04h, 05h
- dst: db 00h, 00h, 00h, 00h, 00h
- main:
- ____lxi_____sp, 0100h__; Инициализируем указателя стека по адресу 0100h.
- ____mvi_____c, 05h_____; Копируем шестнадцатеричное непосредственное значение 03h в регистр C.
- ____lxi_____d, src_____; Загружаем адрес переменной src в пару регистров DE.
- ____lxi_____h, dst_____; Загружаем адрес переменной dst в пару регистров HL.
- ____call____CopyArray__; Вызываем процедуру CopyArray.
- ____hlt________________; Завершаем программу.
- CopyArray:_____________; Процедура CopyArray.
- ____push____psw________; Ложим содержимое стека в слово состояния программы PSW в стек.
- ____push____d__________; Ложим значение пары регистров DE на вершину стека.
- ____push____h__________; Ложим значение пары регистров HL на вершину стека.
- CopyLoop:
- ____ldax____a__________; Загружаем значение по адресу в памяти (src) в аккумулятор A.
- ____mov_____m, a_______; Копируем значение регистра A в память на которую указывает пара регистров HL.
- ____inx ____d__________; Увеличиваем значение пары регистров DE на 1.
- ____inx ____h__________; Увеличиваем значение пары регистров HL на 1.
- ____dcr ____c__________; Уменьшаем значение в регистре C на 1.
- ____jnz_____CopyLoop___; Выполняем переход на метку CopyLoop пока регистр C не будет равен 0.
- ____pop ____h__________; Выталкиваем значение из стека в пару регистров HL.
- ____pop ____d__________; Выталкиваем значение из стека в пару регистров DE.
- ____pop_____psw________; Выталкиваем значение из стека в регистр PSW.
- ____ret________________; Возврат из процедуры обратно к месту вызова.