![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Опис керуючих команд почнемо з команд умовного переходу. Ці команди використовують тільки відносний спосіб адресації, тому для них будемо використовувати умовну позначку адреси переходу 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 |
Дата публикования: 2014-12-08; Прочитано: 1918 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!