Команди передачі керування мікроконтролера mcs51.
⇐ ПредыдущаяСтр 6 из 6
Група представлена командами безумовного та умовного переходів, командами виклику підпрограм і командами повернення з підпрограм. У табл. 6 також вказані тип команди (Т) відповідно до табл. 1, її довжина в байтах (Б) і час виконання в машинних циклах (Ц).
Табл. 6. Команди передачі керування
Команда безумовного переходу LJMP (L – long – довгий) здійснює перехід за абсолютною 16-бітовою адресою, вказаною в команді, тобто команда забезпечує перехід в будь-яку точку пам'яті програми. Дія команди AJMP (А – absolute – абсолютний) аналогічно команді LJMP, проте в команді вказано лише 11 молодших розрядів адреси. Тому перехід здійснюється в межах сторінки розміром 2 Кбайт. Необхідно пам’ятати, що спочатку вміст лічильника команд збільшується на 2 і тільки потім замінюються 11 розрядів адреси.
На відміну від попередніх команд, в команді SJMP (S – short – короткий) вказана не абсолютна, а відносна адреса переходу. Величина зсуву reI розглядається як число із знаком, а, отже, перехід можливий в межах – 128...+127 байт відносно адреси команди, що слідує за командою SJMP. Команда непрямого переходу JMP @A+DPTR дозволяє обчислювати адресу переходу в процесі виконання самої програми. Командами умовного переходу можна перевіряти наступні умови: · JZ - аккумулятор містить нульове значення; · JNZ - аккумулятор містить не нульове значення · JC - біт переносу С встановлений; · JNC - біт переносу С не встановлений; · JB - біт, що прямо адресується, рівний 1 · JNB - біт, що прямо адресується, рівний 0;
Всі команди умовного переходу мікроконтролера MCS-51 містять коротку відносну адресу, тобто перехід може здійснюватися в межах—128... +127 байт відносно наступної команди. Команда DJNZ призначена для організації програмних циклів. Регістр Rn або байт за адресою ad, вказаний в тілі команди, містять лічильник повторень циклу, а зміщення rеl - відносна адреса переходу на початок циклу. При виконанні команди вмістиме лічильника зменшується на 1 і перевіряється на 0. Якщо вмістиме лічильника не рівне 0, то здійснюється перехід на початок циклу, в іншому випадку виконується наступна команда. Команда CJNE зручна для реалізації процедур очікування зовнішніх подій. В команді вказані "координати" двох байт і відносна адреса переходу rel. В якості двох байт команди можуть бути використані, наприклад, вмістиме аккумулятора і байта, що прямо адресується або байта, що прямо адресується та константи. При виконанні команди значення вказаних двох байт порівнюються і у випадку, якщо вони не однакові, здійснюється перехід. Наприклад, команда WAIT: CJNE А, P0, WAIT виконуватиметься до тих пір, поки значення порту P0 не співпаде із значеннями вмістимого аккумулятора. Дія команд виклику підпрограм повністю аналогічна дії команд безумовного переходу. Єдина відмінність полягає в тому, що вони зберігають в стеку адресу повернення. Команда повернення з підпрограми RET відновлює із стека значення вмістимого лічильника команд, а команда повернення з підпрограми обробки переривання RETI. Команди RET і RETI не розрізняють, якою командою – LCALL або ACALL – була викликана підпрограма, оскільки і в тому, і в іншому випадку в стеку зберігається повна 16-розрядна адреса повернення.
Більшість трансляторів з мови Асемблер допускає узагальнену мнемоніку JMP - для команд безумовного переходу і CALL - для команд виклику підпрограм. Конкретний тип команди визначається Асемблером, виходячи з "довжини" переходу або виклику.
90) LJMP ad16 Команда LJMP <ad16> Асемблер: LJMP <мітка> Код: | 0000 | 0010 | А15А14А13А12 | А11А10А9А8 | А7А6А5А4 | А3А2А1А0 | Довжина команди: 3 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+2 Дана команда виконує безумовний перехід на вказаний в ній адрес, завантажуючи в старший та молодший байт лічильника програми відповідно другий та третій байт коду програми. Адрес переходу може знаходитися по будь-якому адресу простору програмної пам’яті в 64КБт. Ця команда на прапорці не впливає.
91) AJMP ad11 Команда AJMP <ad11> Асемблер: AJMP <мітка> Код: | A10A9A8 0 | 0001 | А7А6А5А4 | А3А2А1А0 | Довжина команди: 2 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC[15-0])=(PC[15-0])+2; (PC[10-0])=<ad11> Команда передає виконання програми по адресу, який одержується в результаті об’єднання п’яти старших біт лічильника програми (після збільшення його на два), 7-5 бітів коду операції та другого байта команди. Адрес переходу повинен знаходитися всередині однієї сторінки програмної пам’яті об’ємом 2КБт, що визначається п’ятьма старшими бітами лічильника програми.
92) SJMP rel Команда SJMP <rel> Асемблер: SJMP <мітка> Код: | 1000 | 0000 | rel8 | Довжина команди: 2 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+2; (PC)= (PC)+(rel8) Команда “короткого переходу” передає виконання програми по адресу, вказаному в ній. Адрес переходу обчислюється при складанні зміщення зі знаком в другому байті команди з вмістимим лічильника програми, після додавання до нього 2. Таким чином, адрес переходу повинен знаходитися в діапазоні від 128 байт, що передують команді, до 127 байт, що слідують за нею.
93) JMP @A+DPTR Команда JMP @A+DPTR Асемблер: JMP @A+DPTR Код: | 0111 | 0011 | Довжина команди: 1 байт. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(A[7-0])+(DPTR[15-0]); Команда додає 8-бітне вмістиме аккумулятора без знаку з 16-бітним вказівником даних та завантажує одержаний результат в програмний лічильник, вмістиме якого є адресом для наступної команди. Вмістиме аккумулятора та вказівника даних не змінюється. Ця команда не впливає на прапорці. (A)=86H, (DPTR)=0329H, (PC)=034EH JNP @A+DPTR (PC)=03AFH, (A)=86H, (DPTR)=0329H.
94) JZ rel Команда JZ <rel> Асемблер: JZ <мітка> Код: | 0110 | 0000 || rel | Довжина команди: 2 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+2, якщо (A)=0, то (PC)=(PC)+<rel>; Команда виконує перехід по вказаному адресу, якщо вмістиме аккумулятора рівне нулю, в іншому випадку виконується наступна команда. Адреса переходу обчислюється додаванням відносного зміщення зі знаком в другому байті команди та вмістимим програмного лічильника, після додавання до нього два. Вмістиме акумулятора не змінюється. Команда на прапорці не впливає. 95) JNZ rel Команда JNZ <rel> Асемблер: JNZ <мітка> Код: | 0111 | 0000 || rel | Довжина команди: 2 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+2, якщо (A)<>0, то (PC)=(PC)+<rel>. Команда виконує перехід по вказаному адресу, якщо вмістиме аккумулятора не рівне нулю, в іншому випадку виконується наступна команда. Адреса переходу обчислюється додаванням відносного зміщення зі знаком в другому байті команди та вмістимим програмного лічильника, після додавання до нього два. Вмістиме акумулятора не змінюється. Команда на прапорці не впливає.
96) JC rel8 Команда JС <rel8> Асемблер: JС <мітка> Код: | 0100 | 0000 || rel | Довжина команди: 2 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+2, якщо (С)=1, то (PC)=(PC)+<rel8>. Команда виконує перехід по вказаному адресу, якщо прапорець переносу С рівний одиниці, в іншому випадку виконується наступна команда. Адреса переходу обчислюється додаванням відносного зміщення зі знаком в другому байті команди та вмістимим програмного лічильника, після додавання до нього два. Вмістиме акумулятора не змінюється. Команда на прапорці не впливає.
97) JNC rel8 Команда JNС <rel8> Асемблер: JNС <мітка> Код: | 0101 | 0000 || rel | Довжина команди: 2 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+2, якщо (С)=0, то (PC)=(PC)+<rel8>. Команда виконує перехід по вказаному адресу, якщо прапорець переносу С рівний нулю, в іншому випадку виконується наступна команда. Адреса переходу обчислюється додаванням відносного зміщення зі знаком в другому байті команди та вмістимим програмного лічильника, після додавання до нього два. Вмістиме акумулятора не змінюється. Команда на прапорці не впливає.
98) JB bit, rel8 Команда JB <bit>, <rel8> Асемблер: JB (bit),<мітка> Код: | 0010 | 0000 | bit address | rel8 | Довжина команди: 3 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+3, якщо (bit)=1, то (PC)=(PC)+<rel8>. Команда виконує перехід по вказаному адресу, якщо вказаний біт рівний “1”, в іншому випадку виконується наступна команда. Адреса переходу обчислюється додаванням відносного зміщення зі знаком в третьому байті команди та вмістимим програмного лічильника, після додавання до нього три. Біт, що перевіряється, не змінюється. Команда на прапорці не впливає.
99) JNB bit, rel8 Команда JNB <bit>, <rel8> Асемблер: JNB (bit),<мітка> Код: | 0011 | 0000 | bit address | rel8 | Довжина команди: 3 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+3, якщо (bit)=0, то (PC)=(PC)+<rel8>. Команда виконує перехід по вказаному адресу, якщо вказаний біт рівний “0”, в іншому випадку виконується наступна команда. Адреса переходу обчислюється додаванням відносного зміщення зі знаком в третьому байті команди та вмістимим програмного лічильника, після додавання до нього три. Біт, що перевіряється, не змінюється. Команда на прапорці не впливає.
100) JBC bit, rel8 Команда JBC <bit>, <rel8> Асемблер: JBC (bit),<мітка> Код: | 0001 | 0000 | bit address | rel8 | Довжина команди: 3 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+3, якщо (bit)=1, то (bit)=0, (PC)=(PC)+<rel8>. Команда виконує перехід по вказаному адресу, якщо вказаний біт рівний “1”, в іншому випадку виконується наступна команда. Адреса переходу обчислюється додаванням відносного зміщення зі знаком в третьому байті команди та вмістимим програмного лічильника, після додавання до нього три. В будь-якому випадку, біт, що перевіряється, скидається. Команда на прапорці не впливає.
101) DJNZ Rn, rel8 Асемблер: DJNZ Rn,<мітка> Код: | 1101 | 1rrr | rel8 | Довжина команди: 2 байти. Час виконання: 2 машинних цикли. Алгоритм: якщо (Rn)=0, (PC)=(PC)+2, (Rn)=(Rn)-1; якщо (Rn)=>0 або (Rn)=<0, то (PC)=(PC)+<rel8>.
102) DJNZ ad, rel8 Асемблер: DJNZ <direct>, <мітка> Код: | 1101 | 0101 || direct address || rel8 | Довжина команди: 3 байти. Час виконання: 2 машинних цикли. Алгоритм: якщо (direct)=0, (PC)=(PC)+3, (direct)=(direct)-1; якщо (direct)=>0 або (direct)=<0, то (PC)=(PC)+<rel8>. Команда циклу виконує віднімання “1” з вказаної комірки та здійснює перехід по заданому адресу, якщо результат не рівний нулю. Адрес переходу обчислюється додаванням зміщення (зі знаком), вказаного в останньому байті команди з вмістимим програмного лічильника, після додавання до нього 3. На прапорці ця команда не впливає і допускає як регістрову так і пряму адресації.
103) CJNE A, ad, rel Команда CJNE <байт приймач>, <байт джерело>, <зміщення> Асемблер: CJNE A,<direct>, <мітка> Код: | 1011 | 0101 || direct address || rel8 | Довжина команди: 3 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+3, якщо (A)≠(direct), то (PC)=(PC)+<rel8>, якщо (A)<(direct), то (С)=1, в іншому випадку (С)=0.
104) CJNE A, #d, rel Команда CJNE <байт приймач>, <байт джерело>, <зміщення> Асемблер: CJNE A, #d, <мітка> Код: | 1011 | 0100 || #data 8 || rel8 | Довжина команди: 3 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+3, якщо (A)≠#d, то (PC)=(PC)+<rel8>, якщо (A)<#d, то (С)=1, в іншому випадку (С)=0.
105 CJNE Rn, #d, rel Команда CJNE <байт приймач>, <байт джерело>, <зміщення> Асемблер: CJNE Rn, #d, <мітка> Код: | 1011 | 1rrr || #data 8 || rel8 | Довжина команди: 3 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+3, якщо (Rn)≠#d, то (PC)=(PC)+<rel8>, якщо (Rn)<#d, то (С)=1, в іншому випадку (С)=0.
106) CJNE @Ri, #d, rel; i=0,1 Команда CJNE <байт приймач>, <байт джерело>, <зміщення> Асемблер: CJNE @Ri, #d, <мітка>; i=0,1 Код: | 1011 | 011i || #data 8 || rel8 | Довжина команди: 3 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+3, якщо ((Ri))≠#d, то (PC)=(PC)+<rel8>, якщо ((Ri))<#d, то (С)=1, в іншому випадку (С)=0. Команда порівнює значення перших двох операндів та виконує перехід, якщо операнди не рівні між собою. Адрес переходу обчислюється при допомозі додавання (зі знаком) вмістимого третього байту команди з вмістимим програмного лічильника, після додавання до нього три. Прапорець переносу “С” встановлюється в “1”, якщо значення цілого без знаку <байта приймача>, в іншому випадку значення прапорця “С” скидається. Ці команди не впливають на операнди. Операнди в цих командах забезпечують чотири режими адресації: пряма, безпосередня, непряма, регістрова.
107) LCALL adl6 Команда LCALL <ad16> Асемблер: LCALL <мітка> Код: | 0001 | 0010 || addr[15-8] || addr[7-0] | Довжина команди: 3 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+3, (SP)=(SP)+1, ((SP))=(PC[7-0]), (SP)=(SP)+1, ((SP))=(PC[15-8]) (PC)=<addr[15-0]> Команда викликає підпрограму, що знаходиться по вказаному адресу. При виконанні команди до програмного лічильника додається 3 для одержання адресу наступної команди і після цього, одержаний 16-бітний результат заноситься в стек (SP), спочатку молодший байт, а потім – старший. Вмістиме стеку збільшується на 2. Потім старший та молодший байти програмного лічильника завантажуються відповідно другим та третім байтами команди LCALL. Виконання програми продовжується командою, що знаходиться по одержаному адресу. Підпрограма може починатися в будь-якому місці адресного простору пам’яті програми розміром 64 КБт. Ця команда на прапорці не впливає.
107) ACALL adl1 Команда ACALL <ad11> Асемблер: ACALL <мітка> Код: | A10A9A8 1 | 0001 || A7A6A5A4 || A3A2A1A0 | Довжина команди: 2 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC)=(PC)+2, (SP)=(SP)+1, ((SP))=(PC[7-0]), (SP)=(SP)+1, ((SP))=(PC[15-8]) (PC[10-0])=A10A9A8 A7A6A5A4A3A2A1A0 Команда викликає підпрограму, що знаходиться по вказаному адресу. При виконанні команди до програмного лічильника додається 2 для одержання адресу наступної команди і після цього, одержаний 16-бітний результат заноситься в стек (SP), спочатку молодший байт, а потім – старший. Вмістиме стеку збільшується на 2. Адрес переходу одержується з допомогою конкатенації старших біт вмістимого програмного лічильника, бітів старшого байта команди та молодшого байта команди. Виконання програми продовжується командою, що знаходиться по одержаному адресу. Підпрограма може починатися в будь-якому місці адресного простору пам’яті програми розміром 2 КБт. Ця команда на прапорці не впливає.
109) RET Асемблер: RET Код: | 0010 | 0010 | Довжина команди: 1 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC[15-8])=((SP)), (SP)=(SP)-1, (PC[7-0])=((SP)), (SP)=(SP)-1. Команда “повернення з підпрограми” послідовно завантажує в старший та молодший байти програмного лічильника вмістиме стека, зменшуючи вказівник стека на 2. Виконання головної програми звичайно продовжується по адресу команди, що слідує за ACALL або LCALL. На прапорці ця команда не впливає.
110) RETI Асемблер: RETI Код: | 0011 | 0010 | Довжина команди: 1 байти. Час виконання: 2 машинних цикли. Алгоритм: (PC[15-8])=((SP)), (SP)=(SP)-1, (PC[7-0])=((SP)), (SP)=(SP)-1.
Команда “повернення з переривання” послідовно завантажує в старший та молодший байти програмного лічильника вмістиме стека, зменшуючи вказівник стека на 2 та встановлює “логіку переривань” для прийому інших переривань з рівнем пріоритету, рівним рівню пріоритету тільки що обробленого переривання Виконання головної програми звичайно продовжується по адресу команди, що слідує за командою на якій виявився запит на переривання.
111) NOP
Читайте также: II -приравненное к нотариальному (глав.врач больницы, командиры воинских частей) Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|