Курс лекций - Микропроцессоры

         

Команды ветвления и передачи управления


Команды ветвления позволяют реализовывать и . В микроконтроллерах семейства MCS-51 доступны следующие команды:

  • безусловный переход: , ,
  • Вызов и возврат из подпрограммы: , , ,
  • проверка содержимого аккумулятора: , , ,
  • проверка флага переноса С: ,
  • проверка содержимого любого бита в : , ,

Команды 16-разрядных безусловных переходов и вызовов позволяют осуществить переход в любую точку адресного пространства памяти программ объемом до 64 Кбайт. Примеры команд:

LJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’ LCALL Podprogramma ;Вызов подпрограммы по адресу, обозначенному меткой ‘Podprogramma’

Команды 11-разрядных переходов и вызовов подпрограмм позволяют сократить объем программы, но при этом обеспечивают переходы только внутри программного модуля 2 Кбайт. Эти команды принципиально могут приводить к необнаруживаемым транслятором ошибкам, когда программный модуль размещается на двух соседних 2 Кбайтовых сегментах памяти.

AJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’ ACALL Podprogramma ;Вызов подпрограммы по адресу, обозначенному меткой ‘Podprogramma’

В системе команд имеются команды условных и безусловных переходов относительно начального адреса следующей команды в пределах от (РС)-127 до (РС)+127. Примеры команд:

SJMP Metka ;Переход к команде, расположенной по адресу обозначенному меткой ‘Metka’ JB P3.5, TstNxtUsl ;Если на 6 выводе порта P3 нулевой потенциал, ACALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’ CJNE A, #5, TstNxtUsl ;Если в аккумуляторе содержится число 5, ACALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’

Команды проверки содержимого аккумулятора и флага переноса C могут быть использованы для реализации проверки различных условий. При этом содержимое не изменяется, то есть если требуется произвести несколько проверок одной и той же переменной, то повторно заносить значение этой переменной в аккумулятор не нужно. Например:


MOV A, 34 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 JNB ACC_7, TstEQ5 ;число меньше нуля, CALL Podprogramma ;то вызвать подпрограмму, обозначенную меткой ‘Podprogramma’ TstEQ5 ;------------------------------------------------------------------------------------------------------ CJNE A,#5,TstLT5 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число 5, CALL Podpr5 ;то вызвать подпрограмму, обозначенную меткой ‘Podpr5’ TstLT5 ;------------------------------------------------------------------------------------------------------ JNС TstGE5 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число, меньшее 5, CALL PodprLT5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprLT5’ TstGE5 ;--------------------------------------------------------------------------------- JC TstNxtUsl ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число, большее или равное 5, CALL PodprGE5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprGE5’ TstGT5 ;------------------------------------------------------------------------------------------------------ CJNE A,#6,$+3 ;Если в переменной, хранящейся в ячейке внутренней памяти 34 JC TstNxtUsl ;занесено число, большее 5, CALL PodprGT5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprGT5’ ;--------------------------------------------------------------------------------- JNC TstNxtUsl ;Если в переменной, хранящейся в ячейке внутренней памяти 34 занесено число, меньшее или равное 5, CALL PodprLE5 ;то вызвать подпрограмму, обозначенную меткой ‘PodprLE5’ Как видно из приведённых примеров, команды переходов этого микроконтроллера позволяет реализовать намного более эффективные по количеству команд программы по сравнению с другими процессорами, такими как, например .

Косвенный переход в системе команд микроконтроллеров семейства MCS-51 обеспечивает ветвление программы по содержимому аккумулятора А. Это позволяет реализовывать операцию перехода по заданному коду, эквивалентную оператору case в языке программирования pascal, но намного быстрее (за два машинных цикла).


Использование в этой команде указателя данных DPTR позволяет размещать таблицу переходов в любом месте . Пример реализации команды выбора варианта:

BeginOpCase: ;Начало команды выбора вариантов------------------------------------------------------ MOV DPTR, #JMP_TBL ;Задать начальный адрес таблицы переходов MOV A, 33 ;В этой ячейке хранится переменная, по которой необходимо осуществить переход на обслуживающую программу CLR C ;Осуществить арифметический сдвиг аккумулятора вправо RLC A ;(умножить на 2) т.к. команды переходов занимают два байта JMP @A+DPTR ;Перейти к выполнению заданного в 33 ячейке кода JMP_TBL: ;начало таблицы переходов по содержимому переменной в ячейке памяти 33----------------- JMP Case0 ;Перейти к выполнению кода по числу 0 JMP Case1 ;Перейти к выполнению кода по числу 1 JMP EndCase ;Это число в ячейке 33 в список разрешённых не входит JMP EndCase ;Это число в ячейке 33 в список разрешённых не входит JMP Case4 ;Перейти к выполнению кода по числу 4 EndCase:;------------------------------------------------------------------------------------------

Содержание раздела