Размещение рабочего пространства стека
В ряде систем используется размещение некоторых локальных переменных или оперативного пространства в стеке для использования подпрограммами обработки прерываний. Область временного хранения может быть получена использованием команд PSH и PUL; однако структура стека "последним вошел - первым вышел" (LIFO) делает такой прием непрактичным для данных с объемом более одного - двух байтов. CPU08 располагает командой AIS (16-разрядное сложение с указателем стека), позволяющей распределять пространство. Затем, для обращения к этому пространству могут быть использованы команды индексации указателя стека, как это показано в следующем примере.
IRQINT PSHH ;Сохранить регистр H
AIS # - 16 ;Разместить 16 байтов локальной памяти
STA 3, SP ;Сохранить значение во втором байте локального пространства
* Примечание: Указатель стека должен всегда указывать на следующий пустой уровень стека.
* Уровень, адресованный 0, SP, следовательно, никогда не должен быть
* использован, если только программист может гарантировать отсутствие вызова
* подпрограммы из подпрограммы обслуживания прерывания.
o
o
o
LDA 3, SP ;Считать последнее значение
o
o
o
AIS #16 ;Очистить стек
PULH ;Восстановить регистр H
RTI ;Возврат
* Примечание: Вызов подпрограммы изменяет смещение от SP до пространства локальной переменной, поскольку адрес возврата находится в стеке. Если пользователь желает обратиться к этому пространству данных из подпрограммы вызванной внутри подпрограммы обслуживания прерывания, то смещение должно быть подстроено на +2 байта для каждого уровня вложенной подпрограммы.
|