Примеры использования команд передачи управления

Пример 18. Передать управление по метке LAB, если переключатель банка регистров (бит PSW.4) установлен:

JBSE1: M0V A, PSW                ; ПЕРЕДАЧА PSW В АККУМУЛЯТОР

JB4 LAB                          ; ПЕРЕХОД, ЕСЛИ А.4=1

 

Пример 19. Передать управление по метке LABEL, если счетчик событий достиг состояния 64:

TESTC: MOV A, T      ; ПЕРЕСЫЛКА С0ДЕРЖИМ0Г0 СЧЕТЧИКА В АККУМУЛЯТОР

JB6 LABEL      ; ПЕРЕХОД ПО МЕТКЕ, ЕСЛИ А.6=1

 

Пример 20. Осуществить переход из нулевого банка памяти программ к программе с именем ROUT, расположенной в первом банке памяти программ:

SEL МВ1        ; УСТАНОВКА ФЛАГА MB = 1

JMP ROUT    ; ПЕРЕХОД К ПРОГРАММЕ ROUT

 

Пример 21. Множественное ветвление программы. Допустим, что результатом работы некоторой программы является число X (в пределах от 0 до 15). Необходимо организовать передать управления 16 различным программам с именами ROUT0 — R15 в зависимости от вычисленного значения X:

ORG 100H     ; ЗАДАНИЕ НАЧАЛЬНОГО АДРЕСА ПРОГРАММЫ

ANL A, #0FH; СБРОС СТАРШЕЙ ТЕТРАДЫ А ВО ИЗБЕЖАНИЕ ОШИБКИ ПЕРЕХОДА

JMPP @A      ; ОБРАЩЕНИЕ К ТАБЛИЦЕ ВЕКТОРОВ ПЕРЕХОДОВ

; ТАБЛИЦА BEKТОP0B ПЕРЕХОДОВ

DВ R0UT0      ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UT0

DВ ROUT1     ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UT1

DВ R0UT2      ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UT2

DВ R0UT3      ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UT3

DВ ROUT4     ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UT4

DВ R0UT5      ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UT5

DВ R0UT6      ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UT6

DВ ROUT7     ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UT7

DВ R0UT8      ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UT8

DВ R0UT9      ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UT9

DВ ROUTA    ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UTA

DВ R0UTB     ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UTB

DВ R0UTC     ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UTC

DВ ROUTD    ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UTD

DВ R0UTE      ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UTE

DВ R0UTF      ; НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ R0UTF

 

Заметим, что команда JMPP, таблица векторов и программы ROUT0 – ROUTF должны находиться на одной странице памяти программ. (Следует отметить, что в эмуляторе команда JMPP @A не функционирует предсказуемым образом.)

Пример 22. Организовать ожидание появления нулевого уровня на входе Т0:

WAIT: JT0 WAIT       ; ПЕРЕХ0Д НА WAIT, ЕСЛИ НА ВХОДЕ Т0 ЕДИНИЦА

Пример 23. Организовать ожидание появления единичного уровня на входе INT в предположении, что внешние прерывания запрещены:

WAIT: JNI WAIT       ; ПЕРЕХОД НА WAIT, ЕСЛИ НА ВХОДЕ INT НУЛЬ

Пример 24. Передать управление одной из восьми программ ROUT0 – ROUT7 при появлении нулевого уровня на соответствующем входе порта 1. Наивысшим приоритетом обладает вход Р1.0:

ORL P1, #FFH; НАСТРОЙКА ПОРТА P1 НА ВВОД

LOOP: IN A, P1                         ; ВВОД ДАННЫХ ИЗ ПОРТА P1  

CPL A              ; ИНВЕРСИЯ АККУМУЛЯТОРА

JZ LOOP         ; ОЖИДАНИЕ ПОЯВЛЕНИЯ ПЕРВОГО НУЛЯ

JB0 ROUT0    ; ПЕРЕХОД К ROUT0, ЕСЛИ Р1.0 = 0

JB1 ROUT1    ; ПЕРЕХОД К ROUT0, ЕСЛИ Р1.1 = 0

JB2 ROUT2    ; ПЕРЕХОД К ROUT0, ЕСЛИ Р1.2 = 0

JB3 ROUT3    ; ПЕРЕХОД К ROUT0, ЕСЛИ Р1.3 = 0

JB4 ROUT4    ; ПЕРЕХОД К ROUT0, ЕСЛИ Р1.4 = 0

JB5 ROUT5    ; ПЕРЕХОД К ROUT0, ЕСЛИ Р1.5 = 0

JB6 ROUT6    ; ПЕРЕХОД К ROUT0, ЕСЛИ Р1.6 = 0

JB7 ROUT7    ; ПЕРЕХОД К ROUT0, ЕСЛИ Р1.7 = 0

 

Ветвление осуществляется группой из восьми команд JBb. Приоритеты входов порта Р1 определяются очередностью проверки.

Пример 25. При поступлении на вход Т0 последовательности из восьми нулевых импульсов установить выход Р2.7:

MOV R7, #08H; 3АГРУЗКА В R7 ЧИСЛА ИМПУЛЬСОВ

ONE: JT0 ONE         ; 0ЖИДАНИЕ СИГНАЛА 0 НА ВХОДЕ Т0

ZERO: JT0 SKIP         ; 0ЖИДАНИЕ СИГНАЛА 1 НА ВХОДЕ Т0

JMP ZERO

SKIP: DJNZ R7, ONE; ПОВТОРЯТЬ, ПОКА НЕ ПОСТУПИТ ВОСЬМОЙ ИМПУЛЬС

ORL P2, #80H; УСТАНОВКА ЕДИНИЦЫ НА ВЫХОДЕ 7 ПОРТА 2

 

Длительность нуля и единицы на входе устройства должна быть не менее четырех машинных циклов, т.е. 10 мкс.

Пример 26. Дождаться поступления на вход Т1 100 импульсов и перейти по метке PULSE:

MOV A, #156; ПОМЕСТИТЬ В A ЧИСЛО (256 – 100)

MOV T, A      ; ПРЕДУСТАНОВКА СЧЕТЧИКА

STRT CNT      ; 3АПУСК СЧЕТЧИКА

WAIT: JTF PULSE     ; ПЕРЕХОД, ЕСЛИ ПР0ШЛ0 100 ИМПУЛЬСОВ

JMP WAIT

PULSE:  NOP

 

Пример 27. Запретить прерывания от таймера, но разрешить прерывание после восьми сигналов переполнения таймера. При переходе к процедуре обработки прерывания остановить таймер. Сигналы переполнения подсчитывать в регистре R5:

START: DIS TCNTI      ; ЗАПРЕТ ПРЕРЫВАНИЙ ОТ ТАЙМЕРА

CLR A           ; СБР0С АККУМУЛЯТОРА

MOV T, A      ; СБРОС ТАЙМЕРА

MOV R5, A   ; СБР0С РЕГИСТРА R5

STRT T           ; ЗАПУСК ТАЙМЕРА

Ml:    JTF CNT                     ; ЕСЛИ TF=1, ТО ПЕРЕХОД К COUNT И СБРОС TF

JMP Ml          ; ЦИКЛ

CNT: INC R5            ; ИНКРЕМЕНТ РЕГИСТРА R5

MOV A, R5   ; ПЕРЕСЫЛКА С0ДЕРЖИМОГО R5 В АККУМУЛЯТОР

JB3 INT           ; ПЕРЕХОД К ПОДПРОГРАММЕ 0БСЛУЖИВАНИЯ ПРЕРЫВАНИЯ INT,  

; ЕСЛИ БИТ А.З РАВЕН 1

JMP Ml          ; ПЕРЕХОД, ЕСЛИ БИТ А.З НЕ РАВЕН 1

INT:  STOP TCNT   ; OCТAHOВ ТАЙМЕРА

JMP 07H        ; ПЕРЕХОД К ЯЧЕЙКЕ 7 (ВЕКТОР ПРЕРЫВАНИЯ 07 СЧЕТЧИКА СОБЫТИЙ)




double arrow
Сейчас читают про: