Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




 

Група представлена командами безумовного та умовного переходів, командами виклику підпрограм і командами повернення з підпрограм. У табл. 6 також вказані тип команди (Т) відповідно до табл. 1, її довжина в байтах (Б) і час виконання в машинних циклах (Ц).

 

Табл. 6. Команди передачі керування

Назва команди Мнемокод КОП Т Б Ц Операція
Довгий перехід в повному об’є-мі програмної пам’яті 64 КБт LJMP ad16         (PC) ad16
Абсолютний перехід всередині сторінки в 2 КБт AJMP ad11 a10a9a800001       (PC) (PC) + 2, (PC0-10) ad11
Короткий відносний перехід всередині сторінки в 256 байт SJMP rel         (PC) (PC) + 2, (PC0-10) ad11
Непрямий відносний перехід JMP @A+DPTR         (PC) (A) + (DPTR)
Перехід, якщо вмістиме аккумулятора рівне нулю JZ rel         (PC)(PC)+2, якщо (A)=0, то (PC)(PC)+rel
Перехід, якщо вмістиме аккумулятора не рівне нулю JNZ rel         (PC)(PC)+2, якщо (A)≠0, то (PC)(PC)+rel
Перехід, якщо вмістиме прапорця переносу рівне 1 JC rel         (PC)(PC)+2, якщо (С)=1, то (PC)(PC)+rel
Перехід, якщо прапорець переносу рівний 0 JNC rel         (PC)(PC)+2, якщо (С)=0, то (PC)(PC)+rel
Перехід, якщо вмістиме бітової змінної рівне 1 JB bit, rel         (PC)(PC)+3, якщо (bit)=l, то (PC)(PC)+rel
Перехід, якщо вмістиме бітової змінної рівне 0 JNB bit, rel         (PC)(PC)+3, якщо (bit)=0, то (PC)(PC)+rel
Перехід, якщо біт встановлений, з скиданням біту JBC bit, rel         (PC)(PC)+3, якщо (bit)=1, то (b)0 і (PC)(PC) + rel
Декремент регістру та перехід, якщо вмістиме регістру не рівне нулю DJNZ Rn, rel 11011rrr       (PC)(PC)+2, (Rn)(Rn)- 1, якщо (Rn) ≠ 0, то (PC) (PC) + rel
Декремент байта, що прямо адресується та перехід, якщо вмістиме байта не рівне нулю DJNZ ad, rel         (PC)(PC)+2, (ad)(ad)-1, якщо (ad) ≠ 0, то (PC) (PC) + rel
Порівняння вмістимого аккумулятора з байтом, що прямо адресується і перехід, якщо вмістиме аккумулятора не рівне нулю CJNE A, ad, rel         (PC)(PC)+3, якщо (A) ≠ (ad), то (PC) (PC) + rel, якщо (A) < (ad), то (C) 1, в іншому випадку (C) 0
Порівняння вмістимого аккумулятора з константою і перехід, якщо вмістиме аккумулятора не рівне нулю CJNE A, #d, rel         (PC) (PC) + 3, якщо (A) ≠ #d, то (PC) (PC) + rel, якщо (A) < #d, то (C) 1, в іншому випадку (С) 0
Порівняння вмістимого регістру з константою та перехід, якщо вмістиме регістру не рівне нулю CJNE Rn, #d, rel 10111rrr       (PC) (PC) + 3, якщо (Rn) ≠ #d, то (PC) (PC) + rel, якщо (Rn) < #d, то (C) 1, в іншому випадку (С) 0
Порівняння вмістимого байту в РПД з константою та перехід, якщо вмістиме байту не рівне нулю CJNE @Ri,#d,rel 1011011i       (PC) (PC) + 3, якщо ((Ri)) ≠ #d, то (PC) (PC) + rel, якщо ((Ri)) < #d, то (C) 1, в іншому випадку (C) 0
Довгий виклик підпрограми LCALL adl6         (PC)(PC)+3, (SP)(SP)+1, ((SP)) (PC0…7), (SP) (SP) + 1, ((SP))(PC8…15),(PC) ad16
Абсолютний виклик підпрограми в межах сторінки в 2 КБт ACALL ad11 a10a9a810001       (PC)(PC)+2,(SP)(SP)+ 1, ((SP)) (PC0…7), (SP) (SP) + 1, ((SP)) (PC8…15), (PC0-10) ad11
Повернення з підпрограми RET         (PC8…15) ((SP)), (SP) (SP) - 1, (PC0…7) ((SP)), (SP) (SP) – 1
Повернення з підпрограми обробки переривань RETI         (PC8…15) ((SP)), (SP) (SP) - 1, (PC0…7) ((SP)), (SP) (SP) – 1
Пуста операція NOP         (PC) (PC) + 1

 

Команда безумовного переходу 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;

  • JBC - біт, що прямо адресується, рівний 1 і скидається в нульове значення при виконанні команди.

Всі команди умовного переходу мікроконтролера 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

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...