- •1.2.3 Контрольні запитання і завдання
- •1.2.4 Приклади аудиторних і домашніх завдань
- •1.3 Заняття 2. Двійкова арифметика і основні функції алгебри логіки
- •1.3.2 Методичні вказівки з організації самостійної роботи студентів
- •1.3.3 Контрольні запитання і завдання
- •1.3.4 Приклади аудиторних і домашніх завдань
- •2 Алгоритми і програми проектування мікропроцесорних систем
- •2.1 Мета занять
- •2.2 Методичні вказівки з організації самостійної роботи студентів
- •2.3 Контрольні запитання і завдання
- •2.4 Приклади аудиторних і домашніх завдань
- •3.2.3 Контрольні запитання і завдання
- •3.2.4 Приклади аудиторних і домашніх завдань
- •3.3 Заняття 2,3. Групи команд
- •3.3.1 Мета занять
- •3.3.2 Методичні вказівки з організації самостійної роботи студентів
- •3.3.3 Контрольні запитання і завдання
- •3.3.4 Приклади аудиторних і домашніх завдань
- •4.2.3 Контрольні запитання і завдання
- •4.2.4 Приклади аудиторних і домашніх завдань
- •4.3 Заняття 2. Алгоритми і програми обміну інформацією через послідовний порт
- •4.3.1 Мета занять
- •4.3.2 Методичні вказівки з організації самостійної роботи студентів
- •4.3.3 Контрольні запитання і завдання
- •4.3.4 Приклади аудиторних і домашніх завдань
- •4.4 Заняття 3. Алгоритми і програми обробки інформації в режимі переривань
- •4.4.1 Мета заняття
- •4.4.2 Методичні вказівки з організації самостійної роботи студентів
- •4.4.3 Контрольні запитання і завдання
- •4.4.4 Приклади аудиторних і домашніх завдань
- •61166 Харків, просп. Леніна, 14
3.3 Заняття 2,3. Групи команд
3.3.1 Мета занять
Вивчити особливості виконання команд для різних груп і методи їх застосування під час розв’язання задач обробки інформації.
3.3.2 Методичні вказівки з організації самостійної роботи студентів
Під час підготовки до занять необхідно ознайомитися з лекційним матеріалом з даної теми і матеріалом, викладеним [1,7,8].
Систему команд ОМЕВМ умовно можна розбити на п'ять груп: команди передачі даних; арифметичні команди; логічні команди з байтовими змінними; команди розгалуження програм і передачі управління ОМЕВМ; команди бітового процесора.
Команди передачі даних. Таблиці символів (кодів), зашиті в ПЗП програми можуть бути вибрані за допомогою команд передачі даних з використанням непрямої адресації. Байт константи може бути переданий в акумулятор з елемента пам'яті програм, сумою базового регістра (PC або DPTR) та індексного регістра, що адресується (вмісту А). Це забезпечує, наприклад, зручний засіб реалізації алгоритму перетворення коду ASCII у семисегментний код.
Будь-який осередок 256-байтового блока зовнішнього ОЗУ даних може бути вибраний з використанням побічно-регістрової адресації через регістри покажчики R0 або R1 (вибраного банку робочих регістрів).
Осередок усередині адресного простору 64 Кбайт зовнішнього ОЗУ також може бути вибраний з використанням побічно-регістрової адресації через регістр-покажчик даних DPTR.
Команди передачі між регістрами, що прямо адресуються, дозволяють заносити величину з порту в осередок внутрішнього ОЗУ без використання робочих регістрів або акумулятора.
У логічному процесорі будь-який біт, що прямо адресується, може бути поміщений в біт перенесення і навпаки.
Вміст акумулятора може бути обмінений з вмістом робочих регістрів (вибраного банку) і з вмістом осередків внутрішнього ОЗУ, що адресуються за допомогою побічно-регістрової адресації, а також із вмістом осередків внутрішнього ОЗУ, що прямо адресуються, і з вмістом регістрів спеціального призначення.
Команда MOV <байт призначення>,<байт джерела>
Команда "переслати змінну-байт" пересилає байт, вказаний у другому операнді в осередок, вказаний у першому операнді. Вміст байта джерела не змінюється. Ця команда на прапорці й інші регістри не впливає. Команда допускає 15 комбінацій адресації байта джерела і байта призначення.
MOV A,Rn ; де n=0-7; (A):=(Rn)
Приклад: ;(A)=FAH, (R4)=93H
MOV A,R4 ;(A)=93H, (R4)=93H
MOV A,<direct>; (A):=(direct)
Приклад: ; (A)=93H, (R0)=40H, (ОЗУ[40])=10H
Команда MOVC A,@A+(<R16>), де <R16>- 16-розрядний регістр.
Команда "переслати байт з пам'яті програм" завантажує акумулятор байтом коду або константою з пам'яті програм. Адреса прочитуваного байта обчислюється як сума 8-бітового початкового вмісту акумулятора без знаку і вмісту 16-бітового регістра.
Як 16-бітовий регістр може бути:
1) покажчик даних DPTR;
2) лічильник команд РС.
У разі, коли використовується РС, він збільшується до адреси наступної команди перед тим, як його вміст складається із вмістом акумулятора. 16-бітове складання виконується так, що перенесення з молодших восьми біт може розповсюджуватися через старші біти. Ця команда на прапорці не впливає.
MOVC A,@A+DPTR; : (A):=((A)+(DPTR))
Приклад: ;(A)=1BH, (DPTR)=1020H
;(ПЗП[103B])=48H
MOVC A,@A+DPTR ;(A)=48H, (DPTR)=1020H
MOVC A,@A+PC, : (A):=((A)+(PC))
Приклад: ;(A)=FAH, (PC)=0289H
;(ПЗП[0384])=9BH
MOVC A,@A+DPTR ;(A)=9BH, (PC)=0282H
Арифметичні команди. У наборі команд ОМЕВМ є такі арифметичні операції: складання, складання з урахуванням прапорця перенесення, віднімання із позичанням, інкрементування, декрементування, порівняння, десяткова корекція, множення і ділення. Деякі операції впливають на прапорці: переповнювання, перенесення, проміжного перенесення і прапорці парності в слові стану процесора (PSW). Операції інкрементування та декрементування на прапорці не впливають. Операції порівняння не впливають ні на операнд призначення, ні на операнд джерела, але вони впливають на прапорці перенесення.
Під час операції множення вміст акумулятора А помножується на вміст регістра В і результат розміщується так: молодший байт в регістрі А, старший — в регістрі В. У разі виконання операції ділення ціле від ділення поміщається в акумулятор А, остача від ділення — в регістр В.
Приклади виконання деяких арифметичних команд.
ADD A,<байт-джерела>
Ця команда складає вміст акумулятора А з вмістом байта-джерела, залишаючи результат в акумуляторі. З появою перенесень з розрядів 7 і 3, встановлюються прапорці перенесень (C) і (AC), інакше ці прапорці скидаються. При складанні цілих чисел без знака прапорець CY вказує на появу переповнювання. Прапорець переповнювання OV встановлюється, якщо є перенесення з біта 6 і немає перенесення з біта 7, або є перенесення з біта 7 і немає з біта 6, інакше OV скидається. При складанні цілих чисел із знаком OV вказує на негативну величину, одержану при підсумовуванні двох позитивних операндів або на позитивну суму для двох негативних операндів.
Режими адресації байта-джерела в командах арифметичних операцій: регістровий; побічно регістровий; прямою; безпосередній.
Команда ADD A,Rn ;(A):=(A)+(Rn), де n=0-7
Приклад: ;(A)=C3H, (R6)=AAH
ADD A,R6 ;(A)=6DH, (R6)=AAH
;(AC)=0, (C)=1, (OV)=1
Команда ADD A,@Ri ; (A):=(A)+((Ri)), де i=0,1
Приклад: ;(A)=95H, (R1)=31H, (ОЗУ [31])=4CH
ADD A,@R1 ;(A)=E1H, (ОЗУ [31])=4CH
;(C)=0, (AC)=1, (OV)=0
ADDC A,<байт-джерела>
Ця команда одночасно складає вміст байта-джерела, прапорець перенесення і вміст акумулятора А, залишаючи результат в акумуляторі. При цьому прапорці перенесення і додаткового перенесення встановлюються, якщо є перенесення з біта 7 або біта 3, і скидаються інакше. При складанні цілих чисел без знака прапорець перенесення вказує на переповнювання. Прапорець переповнювання OV встановлюється, якщо є перенесення біта 6 і немає перенесення з біта 7 або є перенесення з біта 7 і немає – з біта 6, інакше OV скидається. При складанні цілих чисел із знаком OV вказує на негативну величину, одержану при підсумовуванні двох позитивних операндів або на позитивну суму від двох негативних операндів. Команда підтримує такі режими адресації байта-джерела: регістровий; побічно регістровий; прямий; безпосередній.
Команда ADDC A,Rn ; (A):=(A)+(Rn)+(C), де n=0-7
Приклад: ;(A)=B2H, (R3)=99H,
;(C)=1
ADDC A,R3 ;(A)=4CH, (R3)=99H
;(C)=1, (AC)=0, (OV)=1
Команда ADDC A,@Ri ; (A):=(A)+((Ri))+(C), де i=0,1
Приклад: ;(A)=D5H, (R0)=3AH,
;(ОЗУ[3A])=1AH, (C)=1
ADDC A,@R0 ;(A)=F0H, (ОЗУ[3A])=1AH
;(C)=0, (AC)=1, (OV)=0
SUBB A,<байт джерела>
Команда "віднімання із позичанням " віднімає вказану змінну разом з прапорцем перенесення з вмісту акумулятора, засилаючи результат в акумулятор. Ця команда встановлює прапорець перенесення (позичання), якщо при відніманні для біта 7 необхідне позичання, інакше прапорець перенесення скидається. Якщо прапорець перенесення встановлений перед виконанням цієї команди, то це вказує на те, що позичання необхідне при відніманні із збільшеною точністю на попередньому кроці, тому прапорець перенесення віднімається зі вмісту акумулятора разом з операндом джерела. (AC) встановлюється, якщо позичання необхідне для біта 3 і скидається інакше. Прапорець переповнювання (OV) встановлюється, якщо позичання необхідне для біта 6, але його немає для біта 7, або є для біта 7, але немає для біта 6. При відніманні цілих чисел із знаком (OV) вказує на негативне число, яке виходить при відніманні негативної величини з позитивної, або позитивне число, яке виходить при відніманні позитивного числа з негативного. У цих командах операнд джерела допускає 4 режими адресації: регістровий; побічно-регістровий; прямий; безпосередній.
Команда SUBB A,@Ri ; (A):=(A)-(C) -((Ri)),где i=0,1
Приклад: ;(A)=49H, (R0)=33H, (C)=1, (ОЗУ[33])=68H
SUBB A,@R0 ;(A)=E0H, (C)=1
;(AC)=0, (OV)=0
Команда SUBB A,#data ; (A):=(A)-(C) -(#data8);
Приклад: ;(A)=BEH, (C)=0,
SUBB A,#3FH ;(A)=7FH, (C)=0
;(AC)=1, (OV)=1
Команда DA A
Команда "десяткова корекція акумулятора для складання" упорядковує 8-бітову величину в акумуляторі після виконаної раніше команди складання двох змінних (кожна в упакованому двійково-десятковому форматі). Для виконання складання може використовуватися будь-який з типів команд ADD або ADDC. Якщо значення бітів 3-0 акумулятора (A) перевищує 9 (XXXX 1010-XXXX 1111) або якщо прапорець АС дорівнює "1", то до вмісту (A) додається 06, одержуючи відповідну двійково-десяткову цифру в молодшому півбайті. Це внутрішнє побітове складання встановлює прапорець перенесення, якщо перенесення з поля молодших чотирьох біт розповсюджується через всі старші біти, а в іншому випадку не змінює прапорець перенесення. Якщо після цього прапорець перенесення дорівнює "1", або якщо значення чотирьох старших біт (7-4) перевищує 9 (1010 XXXX-1111 XXXX), значення цих старших біт збільшується на 6, створюючи відповідну двійково-десяткову цифру в старшому півбайті. І знову при цьому прапорець перенесення встановлюється, якщо перенесення виходить із старших бітів, але не змінюється інакше. Таким чином, прапорець перенесення вказує на те, що сума двох початкових двійково-десяткових змінних більш ніж 100. Ця команда виконує десяткове перетворення за допомогою складання 06, 60, 66 з вмістом акумулятора залежно від початкового стану акумулятора і слова стану програми (PSW).
MUL AB
Команда перемножує 8-бітові цілі числа без знака з акумулятора і регістра В. Старший байт добутку поміщається в регістр В, а молодший – в A. Якщо результат добутку більший за FFH, то встановлюється прапорець переповнювання OV, інакше він скидається. Прапорець перенесення завжди скидається.
Приклад: ;(A)=50H (50H=80), (C)=1,
;(B)=A0H (A0H=160), (OV)=0
MUL AB ;(A)=00H, (C)=0, (B)=32H, (OV)=1
Команда DIV AB
Команда "ділення" ділить 8-бітове ціле без знака з акумулятора А на 8-бітове ціле без знаку в регістрі В. Аккумулятору привласнюється ціла частина частки (старші розряди), а регістру В – остача. Прапорці CY і OV скидаються. Якщо (A)>(B), то прапорець АС не скидається.
Команди логічних операцій з байтовими змінними. Система команд ОМЕВМ дозволяє реалізувати логічні операції: "І", "АБО", що "ВИКЛЮЧАЄ АБО" на регістрі-акумуляторі (А) і байті-джерелі. Другим операндом (байтом-джерелом) при цьому може бути робочий регістр у вибраному банку робочих регістрів; регістр внутрішнього ОЗУ, що адресується за допомогою побічно-регістрової адресації; осередки внутрішнього ОЗУ, що прямо адресуються, і регістри спеціального призначення; безпосередня величина.
ANL <байт призначения>,<байт-джерела>
Команда виконує операцію логічного І над бітами вказаних змінних і поміщає результат у байт призначення. Два операнди забезпечують такі комбінації режимів адресації:
– якщо байтом призначення є акумулятор, то регістровий, побічно-регістровий. Прямий і безпосередній;
– якщо байтом призначення є пряма адреса (direct), то безпосередній (байт-джерело дорівнює константі) і регістровий (тільки А).
Команда ANL A,Rn ; (A):=(A) AND (Rn), де n=0-7
Приклад: ;(A)=FEH, (R2)=C5H
ANL A,R2 ;(A)=C4H, (R2)=C5H
Команда ANL (direct),A ; (direct)=(direct) AND (A)
Приклад: ;(A)=55H, (P2)=AAH
ANL P2,A ;(P2)=00H, (A)=55H
ORL <байт призначення>,<байт джерела>
XRL <байт призначення >,<байт джерела>
Команда ORL "логічне АБО" і команда XRL що "логічне ВИКЛЮЧАЄ АБО" для змінних-байтів виконує операції над бітами вказаних змінних, записуючи результат в байт призначення. Передбачає такі режими адресації: якщо байтом призначення є акумулятор, то регістровий, побічно-регістровий, прямий і безпосередній; якщо байтом призначення є пряма адреса (direct), то безпосередній (байт-джерело дорівнює константі) і регістровий (тільки А).
Команда XRL <direct>,A ; (direct):=(direct) XOR A
Приклад: ;(A)=31H, (P1)=82H
XRL P1,A ;(A)=31H, (P1)=B3H
Команди розгалуження і передачі управління. Адресний простір пам'яті програм ОМЕВМ не має сторінкової організації, що дозволяє вільно переміщувати фрагменти програми усередині адресного простору, при цьому не потрібна зміна номера сторінки.
Команди 16-розрядних переходів і викликів підпрограм дозволяють здійснювати перехід до будь-якої точки адресного простору пам'яті програм об'ємом 64 Кбайт.
Команди 11-розрядних переходів і викликів підпрограм забезпечують переходи усередині програмного модуля місткістю 2 Кбайт.
У системі команд є команди умовних і безумовних переходів щодо початкової адреси наступної команди в межах від (РС)-128 до (РС)+127.
Команди перевірки окремих розрядів дозволяють здійснювати умовні переходи за станом "0" або "1" бітів, що прямо адресуються.
Команди перевірки вмісту акумулятора (на нуль / не нуль) дозволяють здійснювати умовні переходи за вмістом А.
Побічно-регістрові переходи в системі команд ОМЕВМ забезпечують розгалудження щодо базового регістра (вмісту DPTR або PC) із зсувом, що знаходиться в акумуляторі А.
SJMP <мітка>
Команда "короткий перехід" виконує безумовне розгалудження в програмі за вказаною адресою. Адреса розгалудження обчислюється складанням зсуву із знаком у другому байті команди з вмістом лічильника команд після додавання до нього 2.
Таким чином, адреса переходу має знаходитися в діапазоні від 128 байт, що передують команді, до 127 байт, наступних за нею.
SJMP <мітка> ; : (PC):=(PC)+2, (PC):=(PC)+(rel8)
Приклад: ;(PC)=0418H,
;мітка MET1 відповідає адресі 039AH
SJMP MET1 ;(PC)=039AH, де (rel8)=80H=-128 DEC
SJMP MET2 ;(PC)=041AH, де мітка MET2
; відповідає адресі 041AH
;(rel8)=7DH=+125 DEC
AJMP <addr11>
Команда передає управління за вказаною адресою, яка виходить при конкатенації п'яти старших біт лічильника команд РС (після збільшення його на 2), 7-5 бітів коду операції і другого байта команди.
Адреса переходу має знаходитися усередині однієї сторінки об'ємом 2 Кбайт пам'яті програми, що визначається п'ятьма старшими бітами лічильника команд.
AJMP <мітка>; (PC[15-0]):=(PC[15-0])+2, (PC[10-0]):=<addr11>
Приклад: ;(PC)=028FH
;Мітці МТ2 відповідає адреса 034AH
AJMP MT2 ;(PC)=034AH
LJMP<мітка>
Команда "довгий виклик" викликає підпрограму, яка знаходиться за вказаною адресою. Потім старший і молодший байти лічильника команд завантажуються відповідно другим і третім байтами команди. Виконання програми продовжується командою, що знаходиться за одержаною адресою.
JMP @A+DPTR
Команда "непрямий перехід" складає 8-бітовий вміст акумулятора без знака з 16-бітовим покажчиком даних (DPTR) і завантажує отриманий результат у лічильник команд. 16-бітове складання виконується за модулем 2 в шістнадцятому ступені, перенесення з молодшого байта розповсюджується на старший. Вміст акумулятора і покажчика даних не змінюється.
JMP @A+DPTR, (PC):=(A)[7-0]+(DPTR)[15-0]
Приклад: ;(PC)=034EH, (A)=86H, (DPTR)=0329H
JMP @A+DPTR ;(PC)=03AFH, (A)=86H, (DPTR)=0329H
ACALL <adr 11>
Команда "абсолютний виклик підпрограми" викликає безумовно підпрограму, розміщену за вказаною адресою. При цьому лічильник команд збільшується на 2 для отримання адреси наступної команди, після чого набуте 16-бітове значення РС поміщається в стек (спочатку йде молодший байт), і вміст покажчика стека також збільшується на 2. Адреса переходу виходить за допомогою конкатенації старших біт збільшеного вмісту лічильника команд, бітів старшого байта команди і молодшого байта команди.
ACALL <метка> ;(PC):=(PC)+2
;(SP):=(SP)+1
;((SP)):=(PC[7-0])
;(SP):=(SP)+1
;(PC[10-0]):=A10A9A8 II A7A6A5A4A3A2A1A0,
;де II-знак конкатенації (зчеплення)
Приклад: ;ДО ВИКОНАННЯ ACALL
;(SP)=07H
;мітка МТ1 відповідає адресі 0345Н
;тобто (PC)=0345H
ACALL MT1 ;розташована за адресою 028DH, тобто
;(PC)=028DH
;ПІСЛЯ ВИКОНАННЯ ACALL
;(SP)=09H,(PC)=0345H,
ОЗУ[08]=8FH,ОЗУ[09]=02H.
LCALL <addr16>
Команда "довгий виклик" викликає підпрограму, що знаходиться за вказаною адресою. За командою LCALL до лічильника команд РС| додається 3 для отримання адреси наступної команди і після цього отриманий 16-бітовий результат поміщується в стек (спочатку молодший, потім старший байти), а вміст покажчика стека (SP) збільшується на 2. Потім старший і молодший байти лічильника команд завантажуються відповідно другим і третім байтами команди. Виконання програми продовжується командою, що знаходиться за одержаною адресою.
Команда LCALL <мітка> ;(PC):=(PC)+3,
;(SP):=(SP)+1
;((SP)):=(PC[7-0])
;(SP):=(SP)+1
;((SP)):=(PC[15-8])
;(PC):=<addr[15-0]>
RET
Команда "повернення з підпрограми" послідовно вивантажує старший і молодший байти лічильника команд із стека, зменшуючи покажчик стека на 2. Виконання основної команди продовжується за адресою команди, наступної за ACALL або LCALL
CJNE <байт призначення>,<байт джерела>,<зміщення>
Команда порівнює значення перших двох операндів і виконує розгалудження, якщо операнди не рівні. Адреса переходу (розгалудження) обчислюється за допомогою складання значення (із знаком), вказаного в останньому байті команди, із вмістом лічильника команд після збільшення його на три.
Прапорець перенесення Зі встановлюється в "1", якщо значення цілого біта без знака <байта призначення> менше, ніж значення цілого без знака <байта джерела>, інакше перенесення скидається (якщо значення операндів рівні, прапорець перенесення скидається). Ця команда не впливає на операнди.
Операнди, що стоять у команді, забезпечують комбінації чотирьох режимів адресації: прямий, безпосередній; регістровий і побічно-регістровий.
CJNE A,<direct>,<мітка> ; (PC):=(PC)+3
; якщо (direct)<(A), то (PC):=(PC)+<rel8>,
;(C):=0
; якщо (direct)>(A), то (PC):=(PC)+<rel8>
; (C):=1
Приклад: ;(A)=97H, P2=F0H, (C)=0
CJNE A,P2,MT3 ;(A)=97H, P2=F0H, (C)=1
; Адреса, відповідна мітці МТ3 ;обчислюється, ; як (PC):=(PC)+3+(rel8)
MT3: CLR A ;(A):=00H, P2=F0H, (C)=1
Команда DJNZ <байт>,<зміщення>
Команда "декремент і перехід, якщо не дорівнює нулю" виконує віднімання "1" із вказаного осередку і здійснює розгалудження за обчислюваною адресою, якщо результат не дорівнює нулю. Початкове значення 00Н перейде в 0FFH. Адреса переходу (розгалудження) обчислюється складанням значення зсуву (із знаком), вказаного в останньому байті команди, із вмістом лічильника команд, збільшеним на довжину команди DJNZ. На прапорці не впливає. Режими адресації: регістровий; прямий.
Команда DJNZ Rn,<метка> ;(PC):=(PC)+2, (Rn):=(Rn)-1,
;якщо ((Rn)>0 або (Rn)<0), то
;(PC):=(PC)+<rel8>
;де n=0-7
Приклад: ;(R2)=08H, P1=FFH (11111111B)
LAB4: CPL P1.7 ;послідовність команд переключає
DJNZ R2,LAB4 ;R2=07 ; P1.7 вісім разів і приводить до
;появи чотирьох імпульсів на вихід
;P1.7
Команди бітового процесора. Бітовий процесор є частиною архітектури ОМЕВМ сімейства МК51 і його можна розглядати як незалежний процесор побітової обробки. Бітовий процесор виконує свій набір команд, має своє ОЗУ, що побітово адресується, і своє введення-виведення.
Команди, що оперують з бітами, забезпечують пряму адресацію 128 бітів (0—127) в шістнадцяти осередках внутрішнього ОЗУ (осередки з адресами 20Н—2FH) і пряму побітову адресацію регістрів спеціального призначення, адреси яких кратні восьми: Р0(80Н), TCON(88H), Р1(90Н), SCON(98H), Р2(А0Н), IЕ(А8Н), РЗ|(В0Н), IР(В8Н), PSW(D0H), А(Е0Н), B(F0H).
