Стек программного счетчика служит для временного хранения адреса очередной команды при переходе на обработку подпрограммы, цикловой операции или прерывания. Он позволяет хранить до шестнадцати 14-разрядных слов. Таким образом, уровень вложенности подпрограмм не должен превышать 16.
Контроллер прерываний формирует адрес подпрограммы обработчика прерывания. Он использует данные регистров статуса и влияет на выбор источника следующего адреса.
Блоки счетчика циклов, стека счетчика, компаратора циклов и стека циклов позволяют организовать цикловые операции в программе, не привлекая для этого другие регистры процессора.
Логика выбора формирует сигнал для выбора источника следующего адреса команды.
Команды управления программой
Ниже приводится полный список команд, выполняемых программным автоматом в соответствии с принятыми ранее условными сокращениями. Назначение команд приводится в тексте описания этих команд и комментариях для некоторых из команд.
Выполнять цикл до определенного условия:
DO [UNTIL term];
Условный (безусловный) переход:
[IF cond] JUMP |(I4) |;
|(I5) |
|(I6) |
|(I7) |
||
Вызов подпрограммы:
[IF cond] CALL |(I4) |;
|(I5) |
|(I6) |
|(I7) |
||
Переход (вызов подпрограммы) по состоянию вывода флага Flag In:
[IF] |FLAG_IN | |JUMP| ;
|IF NOT FLAG_IN | |CALL|
Изменение состояния вывода флагов:
[IF cond] |SET | |FLAG_OUT | [,...]; {установка флага}
|RESET | |FL0 | {сброс флага}
|TOGGLE | |FL1 | {инверсия флага}
|FL2 |
Возврат из подпрограммы:
[IF cond] RTS;
Возврат из подпрограммы прерывания:
[IF cond] RTI;
Ожидание прерываний:
IDLE;
Команда переводит процессор в режим пониженного потребления на некоторое неопределенное время. Для того, чтобы перевести процессор в этот режим на продолжительное время, необходимо после этой команды вставить команду перехода на IDLE, зациклив тем самым программу. Выход из этого режима произойдет по любому прерыванию процессора.
Допустимые значения и приведены в табл. 18.1 и табл. 18.2 соответственно. Запись может быть меткой или числовым значением от 0 до 0x3FFF. Примеры команд управления программой:
CNTR=100; {Заполнить счетчик циклов}
DO Met1 UNTIL CE; {Выполнить цикл до метки Met1, пока счетчик циклов не пуст}
AX0 = DM(I0,M0); {Переслать данные через регистр AX0}
Met1: DM(I1 ,M1 )=AX0; {в новую область памяти}
JUMP(I4); {Осуществить переход по адресу в индексном регистре I4}
CALL (I6); {Вызвать подпрограмму по адресу в индексном регистре I6}
SET FLAG_OUT; {Установить в 1 вывод FLAG_OUT}
RESET FL2 {Сбросить флаг FL2}
TOGGLE FL0 {Инвертировать флаг FL0}
Met2: IDLE; {Режим ожидания прерывания}
JUMP Met2:
Таблица 18.1 Допустимые значения
Значение |
Пояснение |
CE |
Счетчик циклов пуст |
EQ |
Равно нулю |
NE |
Не равно нулю |
LT |
Меньше нуля |
GE |
Больше или равно нулю |
LE |
Меньше или равно нулю |
GT |
Больше нуля |
АС |
Перенос АЛУ |
NOT AC |
Нет переноса АЛУ |
AV |
Переполнение АЛУ |
NOT AV |
Нет переполнения АЛУ |
MV |
Переполнение умножителя |
NOT MV |
Нет переполнения умножителя |
NEG |
Входной операнд «xop» отрицателен |
POS |
Входной операнд «xop» положителен |
FOREVER |
Бесконечный цикл |
Таблица 18.2 Допустимые значения
Значение |
Пояснение |
EQ |
Равно нулю |
NE |
He равно нулю |
LT |
Меньше нуля |
GE |
Больше или равно нулю |
LE |
Меньше или равно нулю |
GT |
Больше нуля |
AC |
Перенос АЛУ |
NOT AC |
Нет переноса АЛУ |
AV |
Переполнение АЛУ |
NOT AV |
Нет переполнения АЛУ |
MV |
Переполнение умножителя |
NOT MV |
Нет переполнения умножителя |
NEG |
Входной операнд «xop» отрицателен |
POS |
Входной операнд «xop» положителен |
NOT CE |
Счетчик циклов не пуст |
FLAG_IN* |
Вывод FI=1 |
NOT FLAG_IN* |
Вывод FI=0 |
*Только для команд JUMP, CALL
Глава 19. Генераторы адресов
В этой главе говорится об устройствах генераторов адресов сигнального процессора и выполняемых с его помощью командах.
Ранее мы уже рассматривали назначение генераторов адресов (DAG). На этот раз рассмотрим их структуру и команды, которые они позволяют выполнять.
Читать дальше