Доступ к стеку
Аппаратный стек используется автоматически командами CALL, RET и RETI, но также он может явно использоваться для сохранения и восстановления данных. Все данные сохраняются в виде 16 битных слов.
Команда PUSH увеличивает указатель стека SP, а затем сохраняет значение в стеке. При помещении в стек 16- битного значения сохраняются вводимые данные. Однако при помещении в стек 8- битных данных старший байт стека сохраняет содержимое префиксного регистра. Мнемоника доступа к стеку @++SP осуществляет помещение данных, находящихся по указанному адресу. Таким образом, приведенные ниже две последовательности команд эквивалентны:
move PFX[0], IC
push PSF ; сохранение в стеке: IC:PSF
move PFX[0], IC
move @++SP, PSF ; сохранение в стеке: IC:PSF
|
Команда POP извлекает из стека значение и уменьшает указатель вершины стека. Мнемоника доступа к стеку @SP-- определяет в качестве источника специфический регистр, который генерирует этот режим. Таким образом, приведенные ниже две последовательности команд эквивалентны:
Команда POPI эквивалентна команде РОР, за исключением того, что она дополнительно очищает бит INS. Таким образом, приведенные ниже две последовательности команд эквивалентны:
Мнемоника @SP-- позволяет микроконтроллерам MAXQ использовать стек в качестве операнда АЛУ (например, ADD src, XOR src, и т.д.), не требуя, чтобы значение предварительно было извлечено в регистр или аккумулятор.
add @SP-- ; суммирование последних трех слов, помещенных в стек,
add @SP-- ; с аккумулятором Acc, переполнение игнорируется
add @SP--
|
Указатель вершины стека SP может быть установлен явно, однако при этом должны использоваться только те младшие биты, которые соответствуют глубине стека конкретного используемого микроконтроллера семейства MAXQ. Для микроконтроллеров MAXQ, которые имеют глубину стека 16 слов, используются только 4 младших бита.
Так как стек имеет ширину 16 бит, то в одной ячейке можно сохранять два 8- битных регистра. Это позволяет более эффективно использовать стек для сохранения и восстановления регистров в начале и конце подпрограммы.
SubOne:
move PFX[0], IC
push PSF ; сохранение IC:PSF в стеке
...
pop GR ; 16- битный регистр
move IC, GRH ; IC был сохранен как старший байт
move PSF, GRL ; PSF был сохранен как младший байт
ret
|
|