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

Опис керуючих команд почнемо з команд умовного переходу. Ці команди використовують тільки відносний спосіб адресації, тому для них будемо використовувати умовну позначку адреси переходу rel. Для кожної умови існує пара команд, одна з яких здійснює передачу керування при її дотриманні, а інша — при недотриманні. У поле коментарів наводяться розшифровки мнемоніки цих команд. Умовою передачі керування може бути рівність чи нерівність нулю вмісту регістра нагромаджувача:

JZ rel ;Jump if Zero

JNZ rel ;Jump if No Zero

Можна також використовувати як умову переходу рівність біта переносу одиниці чи нулю:

JC rel ;Jump if Carry

JNC rel ;Jump if Not Carry

Існують команди, що використовують як умову переходу рівність одиниці чи нулю вмісту будь-якого біта у функціональному регістрі чи адресованого біта в ОЗП:

JB flag, rel ;Jump if Bit

JNB flag, rel ;Jump if No Bit

Команда передачі керування по рівності біта одиниці має варіант з очищенням умісту цього біта:

JBC flag, rel ;Jump if Bit and Clear

Команди з взаємовиключними умовами дозволяють обійти обмеження, пов'язані зі способом адресації. Якщо адреса команди, на яку потрібно передати керування, відрізняється від адреси наступної команди на велику величину (позитивну чи негативну), то можна використовувати пару команд, перша з якої при дотриманні зворотної умови передає керування через один рядок вихідного тексту, а друга є командою безумовного переходу з абсолютною чи далекою адресацією.

Перераховані команди здійснюють перехід у залежності від результатів попередніх обчислень. Однак є керуючі команди, що самі здійснюють обчислення для одержання умов передачі керування. Мнемокод першої з таких команд – CJNE (Compare and Jump if Not Equal означає «порівняти і перейти, якщо не дорівнює»). Це єдина команда мікроконтролера, що має 3 операнди. Її чотири різновиди відрізняються способами адресації джерела і приймача:

CJNE A, src, rel

CJNE A, #src, rel

CJNE Rn, #src, rel

CJNE @Ri, #src, rel

Команда обчислює різницю першого і другого операндів, але результат віднімання нікуди не записується, за винятком біта переносу. Передача керування за зазначеною адресою здійснюється при нерівності операндів. При порівнянні позитивних чисел біт переносу встановлюється в 1, якщо перший операнд менше другого. Якщо за адресою переходу записати команду передачі керування по вмісту біта переносу, то в результаті одного порівняння можна виконати три різні блоки програми.

Інша команда — DJNZ (Decrement and Jump if Not Zero) означає «зменшити і перейти, якщо не дорівнює нулю») зменшує вміст першого операнда на одиницю. Якщо операнд не дорівнює 0, то керування передається за зазначеною адресою:

DJNZ Rn, rel

DJNZ dst, rel

Ця команда зручна для програмування циклу по лічильнику. Перед початком циклу за адресою приймача треба записати число, рівне кількості повторень циклу. Якщо в другому операнді записати адреса початку циклу і не змінювати вміст першого операнда іншими командами в циклі, то задана ділянка програми буде повторена задану кількість разів.

Перейдемо до команд безумовного переходу JuMP без повернення. Вони використовують адресацію всіх трьох дальностей:

SJMP rel

AJMP adr11

LJMP adr16

Цифри в умовних позначках операндів останніх двох команд указують на кількість розрядів адресної частини їхніх кодів.

Команда безумовного переходу з індексною адресацією дозволяє змінювати адресу переходу за вмістом нагромаджувача:

JMP @A + DPTR

За допомогою цієї команди можна здійснювати переходи за кожною з 256 адрес щодо вмісту регістра покажчика. Оскільки адреса передачі керування залежить від умісту нагромаджувача, цей варіант команди безумовної передачі керування, по суті справи, не є таким. Ця команда може використовуватися як перемикач, якщо в заданій області програми записати команди безумовного переходу на деякі блоки програми. Тому що ці команди будуть займати більш одного байта, розглянута команда може використовуватися для передачі керування не більш ніж за 128 адресам.

Мнемоніка команд безумовного переходу з поверненням CALL переводиться як виклик. Ці команди не використовують коротку адресацію:

ACALL adr11

LCALL adr16

Вони застосовуються для виклику підпрограм, після виконання яких керування повинне повертатися команді, що випливає за командою виклику. Для цієї мети перед занесенням адресної частини команди виклику в програмний лічильник старе значення програмного лічильника записується в два байти ОЗП, які адресуються покажчиком стека. Спочатку в стек заноситься молодший байт програмного лічильника, а потім старший байт.

Для коректного повернення до програмі останньою виконуваною командою підпрограми повинна бути

RET

Мнемоніка цієї команди відповідає слову RETurn (повернутися). Команда не має адресної частини, тому що при її виконанні в програмний лічильник записуються два байти, які адресуються покажчиком стека (першим записується старший байт, а другим — молодший). Програміст повинен забезпечити правильний уміст покажчика стека до моменту виходу з підпрограми. Ця вимога означає, що при виконанні підпрограми кількість команд запису в стек повинне дорівнювати кількості команд читання зі стека. Через те, що адресний простір стека розміщується в ОЗП, програміст повинен подбати про те, щоб команди, що використовують інші способи адресації, не робили запис інформації в адресний простір стека.

Інша команда, що працює точно таким же способом (RETI) застосовується для повернення до програми, що виконувалася в момент апаратного переривання. Літера I у її мнемокоді відповідає слову Interrupt (переривання). Апаратні переривання передають керування фіксованим адресам із запам'ятовуванням адреси повернення.

Група команд передачі управління наведена в табл. 8.5

 

Таблиця 8.5

Група команд передачі управління

Назва команди Мнемокод КОП Т Б Ц Операція
Довгий перехід в повному обсязі пам`яті програм LJMP ad 16 (PC)¬ad 16
Абсолютний перехід усередині сторінки в 2 кбайти AJMP ad 11 a10a9a8 (PC)¬(PC) + 2 (PC0-10)¬ad 11
Короткий відносний перехід усередині сторінки в 256 байтів SJMP rel (PC)¬(PC) + 2 (PC)¬(PC) + re1
Непрямий відносний перехід JMP @A+DPTR (PC)¬(A) + (DPTR)
Перехід, якщо акумулятор рівний нулю JZ rel (PC)¬(PC) + 2, якщо (А) = 0, то (PC)¬(PC)+ re1
Перехід, якщо акумулятор не рівний нулю JNZ rel (PC)¬(PC) + 2, якщо (А) ¹ 0, то (PC)¬(PC)+re1
 
Закінчення табл. 8.5
Назва команди Мнемокод КОП Т Б Ц Операція
Перехід, якщо перенос рівний одиниці JC rel (PC)¬(PC) + 2, якщо (C) = 1, то (PC)¬(PC) + re1
Перехід, якщо перенос рівний нулю JNC rel (PC)¬(PC) + 2, якщо (C) = 0, то (PC)¬(PC) + re1
Перехід, якщо біт рівний одиниці JB bit,rel (PC)¬(PC) + 3, якщо (b) = 1, то (PC)¬(PC) + re1
Перехід, якщо біт рівний нулю JNB bit,rel (PC)¬(PC) + 3, якщо (b) = 0, то (PC)¬(PC) + re1
Перехід, якщо біт встановлений, з наступним скиданням біта JBC bit,rel (PC)¬(PC) + 3, якщо (b) = 1, то (b)¬0 та (PC)¬(PC) + re1
Декремент Рг та перехід, якщо не нуль DJNZ Rn,rel 11011rrr (PC)¬(PC) + 2, (Rn)¬(Rn) - 1, якщо (Rn) ¹ 0, то (PC)¬(PC) + re1
Декремент байта, що адресується прямо, та перехід, якщо не нуль DJNZ ad,rel (PC)¬(PC)+2, (ad)¬(ad) -1, якщо (ad)¹0,то (PC)¬(PC) + re1