Команда JMPP осуществляет переход по адресу, содержащемуся в ячейке ПП, на которую указывает содержимое аккумулятора. Таким образом, аккумулятор содержит адрес адреса перехода. Ячейка с адресом перехода должна находиться на той же странице памяти программ, что и команда перехода JMPP. Команда косвенного перехода обеспечивает простой доступ к таблице, содержащей векторы переходов по программе в зависимости от содержимого аккумулятора, что позволяет легко реализовать механизм множественных ветвлений.
Для организации циклов используется команду DJNZ. Счетчик циклов организуется в одном из регистров текущего банка, для чего в этот регистр загружается число повторений цикла. При выполнении команды DJNZ производится декремент и последующая проверка на нуль содержимого регистра - счетчика циклов. Если его содержимое оказывается ненулевым, то происходит переход к началу цикла, иначе - выход из цикла. Структура программы при этом будет следующей:
MOV |
Rn, |
#N |
;инициализация счетчика циклов |
|
LOOP: |
... |
|
|
;тело цикла |
... |
|
|
|
|
... |
|
|
|
|
CYCLE: DJNZ |
Rn, |
LOOP |
;декремент Rn и переход, |
|
если не нуль
Следует отметить, что команды от метки LOOP до метки CYСLE включительно должны находиться в пределах одной страницы памяти программ.
Для вызова подпрограмм используется команда CALL, позволяющая обратиться в любое место текущего банка памяти программ. При вызове подпрограммы в стеке сохраняется адрес возврата и часть ССП. Глубина вложений подпрограмм ограничена емкостью стека (16 байт) и не должна превышать восьми. Для возврата из подпрограммы необходимо выполнить команду RET, которая восстановит в счетчике команд адрес возврата. Команда RETR служит для выхода из подпрограммы обработки прерывания, так как кроме адреса возврата она восстанавливает PSW и разрешает прерывания от данного источника. При программировании прерываний МК необходимо внимательно отслеживать ситуацию вызова подпрограммы, находящейся в альтернативном (по отношению к текущему) банке ПП. В этом случае перед вызовом подпрограммы необходимо выбрать соответствующий банк памяти, а перед возвратом восстановить старое содержимое DBF.
Если в подпрограмме нет команды восстановления DBF, то возарат все же будет выполнен (т.к. в стеке сохранен полный действительный адрес возврата), однако первая же команда длинного перехода передаст управление в альтернативный банк ПП. Если к подпрограмме производятся обращения из разных банков памяти, то оказывается затруднительно восстановить значение DBF перед возвратом. В этом случае можно рекомендовать использовать команду восстановления DBF в основной программе вслед за командой вызова.
Команды ветвления обеспечивают переход от текущей команды к заданной точке программы при истинности условия (таблица 5), причем все команды условного перехода используют прямую короткую адресацию.
Из таблицы видно, что по командам условных переходов могут проверяться не только внутренние флаги, но и некоторые сигналы на внешних входах МК. Это позволяет эффективно выполнять ветвления в программе без использования процедуры предварительного ввода и последующего сравнения. Анализируемые признаки за исключением С и F0 не фиксируются в специальных триггерах флагов, а представляются мгновенными значениями сигналов в АЛУ или на соответствующих входах МК.
Если условие ветвления выполняется,то (PC[7..0]) =ad8,
иначе (PC) = (PC) +2
Мнемокод команды Машинный код команды Число циклов
Условие ветвления
JC
11110110
2
С==1 JNC
11100110
2
С== 0
JZ
11000110
2
(A) = 0 JNZ
10010110
2
(A) != 0 JF0
10110110
2
F0 == 1 JF1
01110110
2
F1 == 1 JT0 00110110 2
T0 == 1 JNT0 00100110 2
T0 == 0 JT1 01010110 2
T1 == 1 JNT1 01000110 2
T1 == 0 JTF 00010110 2
FT == 1 JNI 10000110
2
I == 0 JBi i=0..7 iii10010
2
A[i] == 1
Мнемо-код команды |
|
|
|
Опе-ранд |
|
|
|
Машин. код |
|
|
|
команы |
|
|
|
Действие |
|
|
|
EN |
|
|
|
I |
|
|
|
00000101 |
|
|
|
Разрешение внешних прерываний |
|
||
DIS |
|
|
|
I |
|
|
|
00010101 |
|
|
|
Запрещение внешних прерываний |
|
||
EN |
|
|
|
TCNTI |
|
|
|
00100101 |
|
|
|
Разрешение |
прерывания |
по переполнению |
таймера/счетчика |
событий |
|
|
|
DIS |
|
|
|
TCNTI |
|
|
|
00110101 |
|
|
|
Запрещение |
прерываний |
при переполнении |
таймера/счетчика |
событий |
|
|
|
STRT |
|
|
|
T |
|
|
|
01010101 |
|
|
|
Запуск таймера
STRT
CNT 01000101
Запуск счетчика событий
STOP
TCNT 01100101
Остановка таймера/счетчика событий
ENTO
CLK 01110101
Разрешение вывода синхроимпульсов
SEL
MB0
11100101
Выбор нулевого банка (MB0) памяти программ. A[11] = 0, то есть
(DBF) = 0 SEL MB1 11110101
Выбор первого банка памяти (MB1) программ. A[11] = 1, то есть
(DBF) = 1 SEL
RB0
11000101 Выбор нулевого банка рабочих регистров резидентной памяти данных
SEL
RB1 11010101
Выбор первого банка рабочих регистров резидентной памяти данных, то есть PSW[4]=1
NOP
00000000
Нет операции
Использование команд управления режимом работы (таблица 6) было рассмотрено при описании соответствующих программно доступных компонентов, за исключением команды NOP. Пустая команда NOP используется для исключения из работы фрагмента программы без модификации других фрагментов ("забой" машинных команд пустой командой) и для формирования задержки времени перед выполнением действий с периферийными устройствами.
Признаки результата могут быть изменены специальными командами установки и сброса, которые представлены в таблице 7.
Мнемокод команды
| 05_Холера |
| 10.4. Исследование регистров |
| 1112 |
| 12 |
| 1568 |
| 1673 |
| 17 |
| 1703 |
| 1885 |
| 2. Генераторы постоянного тока |