Команды ветвления и передачи управления
Команды ветвления позволяют реализовывать условные операторы и операторы циклов. В микроконтроллерах семейства MCS-48 доступны следующие команды:
- безусловный переход:
- Вызов и возврат из подпрограммы: , , RETR
- проверка содержимого аккумулятора: , , , ...
- проверка флага переноса С: ,
- проверка сигнала на ножке T0: ,
- проверка сигнала на ножке T1: ,
- проверка сигнала на ножке INT:
- Проверка состояния флагов пользователя ,
Команды безусловных переходов и вызовов позволяют осуществить переход в любую точку адресного пространства памяти программ в пределах страницы 2 Кбайт. Примеры команд:
;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’ CALL Podprogramma ;Вызов подпрограммы по адресу, обозначенному меткой ‘Podprogramma’В системе команд имеются команды условных переходов. Эти команды позволяют осуществлять переход в пределах страницы 256 байт.
Примеры использования команд условного перехода:
JB5 TstNxtUsl ;Если в 6 бите аккумулятора нулевое значение, CALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’ JNZ A, #5, TstNxtUsl ;Если в аккумуляторе содержится нулевое значение, CALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’Команды проверки содержимого аккумулятора и флага переноса C могут быть использованы для реализации проверки различных условий:
MOV A, 34 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 JB7 TstNxtUsl ;число меньше нуля, CALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’ ;--------------------------------------------------------------------------------- MOV A, 34 ;Если в переменной, ADD A, -5 ;хранящейся в ячейке внутренней памяти 34 JZ TstNxtUsl ;занесено число 5, CALL Podpr5 ;то вызвать подпрограмму, обозначенную меткой ‘Podpr5’ ;--------------------------------------------------------------------------------- MOV A, 34 ;Если в переменной, ADD A, -5 ;хранящейся в ячейке внутренней памяти 34 JNС TstNxtUsl ;занесено число, меньшее 5, CALL PodprLT5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprLT5’ ;--------------------------------------------------------------------------------- MOV A, 34 ;Если в переменной, ADD A, -6 ;хранящейся в ячейке внутренней памяти 34 JC TstNxtUsl ;занесено число, большее 5, CALL PodprGT5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprGT5’ ;--------------------------------------------------------------------------------- MOV A, 34 ;Если в переменной, ADD A, -5 ;хранящейся в ячейке внутренней памяти 34 JC TstNxtUsl ;занесено число, большее или равное 5, CALL PodprGE5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprGE5’ ;--------------------------------------------------------------------------------- MOV A, 34 ;Если в переменной, ADD A, -6 ;хранящейся в ячейке внутренней памяти 34 JNC TstNxtUsl ;занесено число, меньшее или равное 5, CALL PodprLE5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprLE5’Косвенный переход JMPP @A в системе команд микроконтроллера обеспечивает ветвление программы по содержимому аккумулятора А.
Это позволяет реализовывать операцию перехода по заданному коду, эквивалентное оператору case в языке программирования pascal, но намного быстрее (за два машинных цикла). Пример реализации команды выбора варианта:
ORG 256 ;Разместить команды переходов по границе страницы JMP Case0 ;Перейти к выполнению кода по числу 0 JMP Case1 ;Перейти к выполнению кода по числу 1 JMP EndCase ;Это число в ячейке 33 в список разрешённых не входит JMP EndCase ;Это число в ячейке 33 в список разрешённых не входит JMP Case4 ;Перейти к выполнению кода по числу 4 BeginOpCase: ;Сюда нужно перейти командой JMP BeginOpCase MOV A, 33 ;В этой ячейке хранится переменная, по которой необходимо осуществить переход на обслуживающую программу CLR C ;Осуществить арифметический сдвиг аккумулятора вправо RLC A ;(умножить на 2) т.к. команды переходов занимают два байта JMPP @A ;Перейти к выполнению заданного в 25 ячейке кода EndCase: