Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра АСУ
МЕТОДИЧНІ ВКАЗІВКИ
ДО КУРСУ ЛАБОРАТОРНИХ РОБІТ
для студентів базового напрямку 6.0804
«Комп'ютерні науки»
з дисципліни:
«Архітектура комп'ютерів»
Затверджено на засіданні
кафедри АСУ
протокол №___________
від «___»________20__р.
Львів – 2007
Архітектура комп'ютерів : методичні вказівки до курсу лабораторних робіт для студентів базового напрямку 6.0804 «Комп'ютерні науки» /Укл.:Стрямець С.П., Ткаченко Р.О..- Львів : Видавництво Національного університету
«Львівська політехніка», 2007. - 22 с.
Укладачі:
Ткаченко Р.О., проф., д. т. н., Стрямець С.П., к. т. н., доц.
Відповідальний за випуск:
Шпак З.Я. к.т.н., доц.
Рецензент :Різник В.В., Проф., д.т.н.
Лабораторна робота №1
Тема: Загальна структура мікролабораторії і процесора.
Мета: Вивчити структуру мікролабораторії і процесора, і після чого написати програму за вказівками поданими нижче.
Мікролабораторія являє собою мікрокомп'ютер на базі однокристального мікропроцесора "КР580ИК80А ".
У мікропроцесорі є такі 8-бітні регістри :
А-акумулятор, в якому знаходиться результат виконання довільної арифметико-логічної 8-
бітної операції;
F-регістр прапорців (ознак);
В, С, D, Е, Н, L-регістри загального призначення. Вони об'єднуються у 16-бітні регістри по
парах: АF, ВС,DЕ, НL.
Команда може займати від одного до трьох байтів: перший байт - код операції, другий та третій - 8-бітний або 16-бітний операнд (в залежності від операції).
Після виконання арифметико-логічної команди в мікропроцесорі встановлюються ознаки результату, які зберігаються у двійковому вигляді і називаються прапорцями. У більшості мікропроцесорів існують стандартні прапорці :
CARRI-перенос за межі регістра;
ZERO - нульовий результат;
PARITY- результат має парну кількість одиничок; SIGN - знак числа (старший біт результату);
На прапорці не впливають команди пересилки, розгалуження та вводу-виводу.
Завдяки існуванню прапорців обчислювальний процес може розгалужуватись трьома видами команд:
Умовними переходами на мітку в залежності від стану прапорців
Умовними викликами підпрограм;
Поверненнями з підпрограм за станом прапорців.
Мнемоніка розгалужуючих команд:
Команди розгалуження розділяються на умовні переходи (J), умовні виклики (С), умовні
повернення (R):
JC, СС, RС - перехід виконується, якщо встановлений прапорець переносу;
JNC, CNC, RNC - виконується, якщо немає переносу;
JZ,, CZ, RZ, - виконується, якщо нуль;
JNZ, CNZ, RNZ,- виконується, якщо не нуль;
JP, СР, RP - виконується, якщо результат додатній;
JM, СМ, RM - виконується, якщо результат від'ємний;
JPO, СРО, RРО - виконується, якщо встановлений прапорець парності;
JPE, СРЕ, RРЕ - виконується, якщо не встановлений прапорець парності.
На стан прапорців не впливають такі команди:
команди переходу; команди виклику підпрограм; команди повернень з підпрограм, а
також:
"INX" - 16- бітного інкременту;
"DCX" - 16- бітного декременту;
Вводу "IN", виводу "OUT" ;
Регістрові пересилки "MOV, "SHPL";
"ХСНG' - обміну регістрових пар "DЕ" і "НL"
"ХТНL"- обміну верхівки стека і "НL";
"MVI" - завантаження регістра;
"LХІ"- завантаження регістрової пари;
"РUSН" - опускання в стек регістрової пари;
"РОР"- виймання із стека регістрової пари;
"NOP" порожня команда;
"LDА" та "LDАХ"- читання з пам'яті в акумулятор за безпосередньою адресою або за адресою,
яка знаходиться в регістровій парі;
"SТА" та "SТАХ"- аналогічні команді-запису-акумулятора в пам'ять;
"LHLD" - читання двох байт по безпосередній адресі та завантаження їх у регістрову пару "НL";
"SHLD"- запис "НL" в пам'ять (протилежна команда).
Решта команд встановлюють прапорці відповідно з їх призначенням: "INR", "DCR" - восьмибітного інкременту та декременту :
арифметичні команди АDD, АDC, ADI, SUB, SВВ, SUI;
логічні команди АNА, ОКА, ХRА;
команди порівняння СМР, СРІ;
команди зсуву через перенос та спеціальні команди RАL, КАК- додавання регістрових пар допари НL - DАD;
У мікропроцесорі існують спеціальні 16- бітні регістри :
SР - вказівник стеку;
РС - програмний лічильник.
У "РС" знаходиться адреса команди, де на даний момент виконується програма.
Стек - це організація даних за принципом - останній увійшов, першим вийшов. У "SР" знаходиться адреса верхівки стека. Якщо у стек записуються дані (командою "РUSН") або адреса (командами виклику підпрограм), то "SР" зменшується на 2, тобто стек зростає від кінця пам'яті до початку.
Пам'ять розділено на постійну і оперативну, у постійній пам'яті знаходиться монітор -програма, на яку передається управління після натиснення клавіші "СБРОС". Монітор дозволяє вводити і запускати в абсолютному шістнадцятковому коді програму користувача, а також має тестову програму, яка грає мелодію.
В оперативній пам'яті (її початок знаходиться за адресою #8000) розміщені програми користувача, стек та робочі комірки монітора .
Для введення програми її треба перед тим відтранслювати з допомогою таблиці кодів. Трансляція виконується в такій послідовності: записується в 16-ій формі адреса команди, код операції, операнди (якщо передбачені). Після того програма готова виконати наступні дії:
Натиснути "СБРОС" ;
Набрати на клавіатурі адресу початку програми (8000);
Натиснути клавішу "УСТ. АДР" . Набрана адреса повинна з'явитись на чотирьохлівих індикаторах. Якщо адреса не з'явилась, або з'явилась з помилкою, то повторити зпункту 1.
Набирати на двох правих індикаторах коди програми і даних, натискаючи післякожного байту клавішу "ЗАП".
Перевірити введені коди, рухаючись по пам'яті за допомогою клавіш "АД-","АД+". Якщо знайдено код з помилкою, набрати вірне значення і натиснути "ЗАП".Якщо адреса коду, яка висвічується на чотирьох лівих індикаторах не співпадає задресою, яка вказана у тексті програми, то повторити ввід з пункту 1.
6. Встановити адресу початку програми і натиснути "ПУСК".
У лабораторній роботі необхідно ввести і виконати програму, яка вводить дані з перемикачів, обробляє їх і виводить результат на світлодіоди.
Процесор отримує і видає інформацію назовні через інтерфейс вводу/виводу -мікромодуль "КР580ВВ55А". Інтерфейс має три 8- бітні порти, до яких під'єднані клавіатура (крім клавіші "СБРОС"), світлодіоди, перемикачі, гучномовець. Обмін з інтерфейсом йде через акумулятор за допомогою команд "IN","OUT". Перед тим, як працювати з інтерфейсом, його потрібно запрограмувати за допомогою керуючого коду, що вказує, які порти повинні працювати на ввід, а які - на вивід.
Завдання
Виконати програму для всіх 11 пунктів таблиці 1, які змінюють байти #8006, #8007, #8008. Після кожного запуску перевіряти, як впливають стани перемикачів на світлодіоди, записувати стани світодіодів в звіт. Необхідно виконати 11 запусків програми приведеної в таблиці 1, які відрізняються байтами 8006-8008, які подані в таблиці 2.
Таблиця 1
Адреса
Програма
Коментар
8000
MVI А,#81
ЗЕ,81
Завантажити в акумулятор код для програмування інтерфейса
8002
OUT#FВ
D3,FВ
Вивести вміст акумулятора на програмуючий порт інтерфейса
8004
М1: IN#FА
DВ,FА
Ввід у акумулятор стан перемикачів з порту #FА
8006
N0P
00
Порожні команди для резервування місця під інші команди
8007
N0P
00
8008
N0P
00
8009
OUT #F9
D3,F9
Вивід вмісту акумулятора на порт світло діодів
800В
JMP M1
СЗ,04,80
Безумовний перехід. Замість мітки записується її адреса у вигляді: молодший байт, старший байт
Таблиця 2
Байти з адресою
Коментар
8006
8007
8008
1
N0P
N0P
N0P
Порожня операція
2
ХRI
#1Р
N0P
Сума акумулятора по МOD 2 з байтом #1Р
3
RLС
КLС
N0P
Циклічний зсув акумулятора вліво на 2 біта
4
RRС
RRC
N0P
Циклічний зсув акумулятора вправо на 2 біта
5
8ТС
RAL
N0P
Встановлення прапорця переносу і зсув акумулятора вліво через перенос
6
8ТС
RA R
N0P
Встановлення прапорця переносу і зсув акумулятора вправо через перенос
7
МVI С
#0А
ОRА С
Завантажити у регістр "С" число #0А (00001010) і диз'юнкція регістра "С" з акумулятором
8
МVІ С
#0А
АNA С
Завантажити у регістр "С" число #0А (00001010) і кон'юнкція регістра "С" з акумулятором
9
МVІ С
#0А
ХRА С
Завантажити у регістр "С" число #0А (00001010) і сума по МOD 2 регістра "С" з акумулятором
10
МVІ
с
#0А
АDD С
Завантажити у регістр "С" число #0А (00001010) і додавання акумулятора з регістром "С"
11
МVІ
с
#0А
SUBС
Завантажити у регістр "С" число #0А (00001010) і віднімання акумулятора з регістром "С"
Результати роботи програми описати у вигляді станів світлодіодів. Наприклад, перший пункт таблиці виглядає так:
0 0 0 0 X1 Х2 Х3 0
- світлодіод згасає незалежно від стану перемикачів
- світлодіод світиться незалежно від стану перемикачів
Xj - стан світлодіода залежить від стану перемикача у прямому напрямку
Yj - стан світлодіода залежить від стану перемикача у зворотньому напрямку.
Результати роботи
0 0 0 0 X, Х2 Х3 0
Лабораторна робота №2
Тема: Складання простих програм на прикладі програмування звукових ефектів
Мета: Написати програму, що створює гудки пивної частоти, проекспериментувати з програмою і на основі результатів зробити висновки.
У мікропроцесорній лабораторії гучномовець приєднано до молодшого біта порта
світло-діодів. Якщо змінювати по послідовному каналу десятки разів на секунду стан молодшого біта порту з одиниці на нуль і навпаки, то в гучномовці буде звук певної частоти. Наприклад, нота «ля» 1-ої октави-це коливання фізичного тіла (камертон, струна) 440 раз в секунду, тобто 440 Гц. Програмним шляхом можна змінювати часові затримки між командами (імпульсами) і тим самим змінювати висоту звуку.
Завдання 1
Відтранслювати та виконати програму, яка видає гудок певної частоти. Знаки запитання у програмі означають довільний байт. Зірочками помічені команди, які треба поміняти для виконання наступного етапу.
Результат
Адреса
Програма
Коментар
8000
N0P
Зарезервоване місце
8001
N0P
Порожні команди
8002
МVІ А, #81
Завантажити в акумулятор код для програмування інтерфейсу
8004
OUT #FВ
Вивести вміст акумулятора на програмний порт інтерфейсу
8006
М1: INR A
Інвертування молодшого біта шляхом збільшення на одиницю
8007
МVІ С, #FF
Завантажити в регістр "С" період затримки між імпульсами, вираженими у часі виконання команд "DCR" та "JNZ"
8009
М2: DCR C
Зменшення лічильника циклів затримки на одиницю
800А
JNZ М2
Перехід на початок циклу
800D
OUT #F9
Вивід молодшого біта акумулятора на гучномовець
800Р
N0P
Зарезервоване місце для подальших етапів роботи
8010
JMP M1
Перехід на підготовку до виконання наступного імпульсу
Завдання 2
Замінити у введеній програмі команди, що помічені зірочками. Запустити програму. Визначити за яким законом змінюється частота звуку.
Результат
Адреса
Програма
Коментар
8000
N0P
Зарезервоване місце
8001
N0P
Порожні команди
8002
MVІ А, #81
Завантажити у акумулятор код для програмування інтерфейсу
8004
OUT #FB
Вивести вміст акумулятора на програмний порт інтерфейсу
8006
М1: INR В
інкремент регістра В (інвертувати молодший біт регістру В)
8007
МОV А, В
Вміст регістра В передати в акумулятор А
8008
МОV С, В
Підготовка до затримки
8009
М2: DCR C
Зменшення лічильника циклів затримки на одиницю
800А
JNZ М2
Реалізація затримки
800D
OUT #F9
Вивід інвертованого імпульсу на гучномовець
800Р
N0P
Зарезервоване місце для подальших етапів роботи
8010
JNZ M1
Перехід на підготовку до видачі наступного імпульсу
Завдання З
Виконати програму, яка видає короткий гудок і зупиняється.
Результат
Адреса
Програма
Коментар
8000
+МVІ Е, #FF
Завантажити у регістр "Е" кількість імпульсів, яку треба видати на гучномовець
8002
МVІ А, #81
Завантажити в акумулятор код для програмування інтерфейсу
8004
OUT #FВ
Вивести вміст акумулятора на програмуючий порт інтерфейсу
8006
М1: INR A
Інвертування молодшого біта шляхом збільшення на одиницю
8007
МVІ С, #FF
Завантажити у регістр "С" період затримки між імпульсами, вираженими у часі виконання команд "DCR" та "INZ"
8009
М2: DCR C
Зменшення лічильника циклів затримки на одиницю
800А
JNZ M2
Перехід на початок циклу, якщо не нуль
800D
OUT #F9
Вивід інвертованого імпульсу на гучномовець
800Р
DCR E
Зменшити лічильник імпульсів на одиницю
8010
JNZ M1
Перехід на підготовку до видачі наступного імпульсу, якщо не нуль
8013
HLT
Зупинка процесора
Завдання 4
З поданої вище програми зробити підпрограму, яка видає гудок у залежності від коду натиснутої клавіші. Основну програму розмістити в пам'яті за адресою #8100. У основній програмі використання підпрограми вводу з клавіатури, яка знаходиться у моніторі за адресою #216. Код клавіші після звернення до підпрограми буде знаходитись в акумуляторі.
Результат
Адреса
Програма
Коментар
8100
М3: CALL #0216
Опитати клавіатуру
8103
RLC
Збільшити код клавіші в 4 рази
8104
RLC
8105
МОV В, А
Зберегти його у "В" як параметр частоти
8106
САLL #8000
Викликати підпрограму для видачі звуку
8109
JMP М3
Зробити нескінчений цикл
8000
МVІ Е, #FF
Завантажити у регістр "Е" кількість імпульсів, яку треба видати на гучномовець
8002
МVІ А, #81
Завантажити в акумулятор код для програмування інтерфейсу
8004
OUT #FB
Вивести вміст акумулятора на програмуючий порт інтерфейсу
8006
М1: INR А
Інвертування молодшого біта шляхом збільшення на одиницю
8007
МОV С, В
Переслати у регістр "С" параметри затримки
8008
N0P
Порожня команда
8009
М2: DCR C
Зменшення лічильника циклів затримки на одиницю
800А
JNZ M2
Перехід на початок циклу, якщо не нуль
800D
OUT #F9
Вивід інвертованого імпульсу на гучномовець
800Р
DCR E
Зменшити лічильник імпульсів на одиницю
8010
JNZ M1
Перехід на підготовку до видачі наступного імпульсу, якщо не нуль
8013
RET
Безумовне повернення з підпрограми
Лабораторна робота №3
Тема: Робота з підпрограмами на прикладі програм знаходження добутку двох 8-бітних чисел Мета: Використовуючи програму для знаходження добутку двох 8-бітних чисел виконати наступні два завдання.
У мікропроцесорі "КР580ИК80А" не існує операції множення чисел. Отже, коли треба знайти добуток двох чисел, треба використовувати підпрограми множення. Вам необхідно скласти таку підпрограму, встановлювати її, та виконати для двох прикладів, окремих для кожного студента. Вся необхідна інформація для складання програми знаходиться у роботах N1 та N2.
Завдання 1
Для даного алгоритму множення представити його кожний пункт однією командою на Асемблері.
Завантажити #9 у лічильнику тактів множення;
Обнулити регістри результату;
Зменшити лічильник тактів;
Повернутися з підпрограми, якщо результат дорівнює нулю;
Зсув регістрів результату "НL" вліво, використовуючи команду подвійного додавання(НL:=НL+НL);
Зсув першого множника вліво через прапорець переносу;
Перехід до пункту 3, якщо немає переносу;
До результату додати другий множник, використовуючи команду подвійного додавання;
Перейти до пункту 3.
Розподіл регістрів:
А- перший множник;
С- лічильник тактів;
D- нульове значення;
Е- другий множник;
HL - результат множення.
Завдання 2
Скласти по пунктах основну програму, яка звертається до підпрограми множення і розмістити її за адресою #8100:
Завантажити пеpший множник командою "МVІ";
Завантажити другий множник та регістр "D" командою "LХІ";
Викликати підпрограму множення;
Результат, отриманий у регістрах "Н" (старша частина) і "L" (молодша частина), записатиза вільною адресою, використовуючи команду "SHLD";
Зупинити процесор.
Результат перевести у десяткову форму та перевірити.
Лабораторна робота №4
Тема: Робота з прапорцями на прикладі програми ділення чисел.
Мета: Використовуючи за приклад програму для ділення чисел, та прапорці, виконати наступне завдання.
Завдання
1. В роботі необхідно скласти програму (алгоритм ділення приведено нижче), яка виконує ділення числа, завантаженого у регістр "L" на 8-бітне число, яке введене з клавіатури. Вся необхідна інформація для складання програми знаходиться в роботах №4,№5,№6. Кожний пункт представити командами Асемблера.
Алгоритм ділення:
Прочитати з клавіатури дільник;
Занести його в регістр "Е";
Завантажити в регістр "L" ділене;
Завантажити в акумулятор код програмування інтерфейсу для виводу на світлодіоди;
Вивести його на програмуючий порт;
Онулити регістр "В";
Онулити регістр "D";
Онулити регістр "НГ;
Завантажити у "С" кількість тактів ділення: #8;
Зсунути "НL" вліво;
Переслати "Н" в акумулятор;
Відняти від "А" дільник;
Якщо результат від'ємний - встановиться прапорець переносу, перейти до пункту 15;
Інакше переслати результат віднімання у "Н";
Інвертувати біт переносу (СМС);
Переслати в акумулятор вміст регістра "D";
Зсунути акумулятор через перенос вліво;
Скопіювати акумулятор в регістр "D";
Зменшити лічильник тактів;
Перехід, якщо не нуль, до пункту 10;
Вивести результат ділення на порти світлодіодів;
Організувати затримку результату на світлодіодах - зменшити 16-бітний регістр "ВС";
Переслати вміст "В" в акумулятор;
Диз'юнкція з регістром "С";
Якщо не нуль, то перейти на цикл затримки - пункт 22;
Перейти до пункту 1;
2.Після запуску програми отримати та перевірити результат, натискаючи на клавіші 1, 2, 3, 4, 5, 6, 7, 8, 9, А .
3. При захисті роботи пояснити, чому треба інвертувати прапорець переносу у пункті 15.
Лабораторна робота №5
Тема: Операції над стеком.
Мета: Необхідно написати програму яка методом перебору знаходить оптимальний хід для гри "Сірники".
У будь-якому мікропроцесорі для роботи зі стеком існує спеціальний регістр - вказівник стека (SР), який містить адресу верхівки стека. Стек - це така організація пам'яті, де для читання або запису даних не треба явно вказувати їх адресу. Прочитати дані після декількох операцій запису можна тільки у зворотному порядку: останнім прийшов - першим вийшов. У дійсності, адреса, за якою процесор читає та записує дані при роботі із стеком, знаходяться у регістрі "SР". Якщо при виконанні зустрічається команда "РUSН" опустити в стек, то процесор зменшує (SР) на два, та розміщує дані у пам'яті за його адресою, по команді "РОР" процесор виконує зворотні дії: читає дані за адресою (SР) у регістрі і збільшує вміст (SР) на два. За одну операцію "РUSН" або "РОР" пересилаються два спарених 8-бітних регістри. За допомогою стека реалізовано апарат виклику та повернення з підпрограм: адреса команди, на яку слід повернутись, засилаються у стек, а при поверненні витягаються та передаються у програмний лічильник (РС).
Завдання
У лабораторній роботі треба виконати програму, яка знаходить методом перебору найкращий хід в забавку "сірники", дотримуючись при виборі мінімаксної стратегії (розглядається в теорії ігор).
Умова гри: машина і людина беруть по черзі сірники із загальної купи, за один раз можна брати від одного до трьох сірників, програє той, хто бере останній сірник.
Вхідні дані до підпрограми: в акумуляторі - кількість сірників на N-му ході (задаватине більше #0F)
Вихідні дані підпрограми: у регістрі "D" - оптимальна кількість взятих машиноюсірників; в акумуляторі - значення функції виграшу.
Константи підпрограми: у регістр "В" завантажується максимальна кількістьсірників, яку можна взяти (задавати 3, 4, 5, 6).
Підпрограма для знаходження оптимального ходу
Кожний пункт співпадає з однією командою на асемблері.
Підготувати регістри до процесу знаходження ходу: опустити у стек вміст регістровоїпари «НL»
Опустити у стек вміст регістрової пари «ВС».
Звільнити акумулятор, переслати у «С» з «А» кількість сірників, яка є на столі.
Підготувати початкові значення. Завантажити у «В» максимально можливу кількістьсірників, яку будемо пробувати брати (див.умову).
Завантажити у «Н» початкове значення функції виграшу, що дорівнює нулю.
Головний процес (спроба ходу): переслати в акумулятор кількість сірників, яка є настолі (див. п.З).
Відняти від вмісту акумулятора кількість сірників, яку спробуємо взяти.
Перехід до п. 19, якщо результат від'ємний (встановився CARRY).
Якщо результат віднімання дорівнює нулю, то взяли останній сірник, тобто програли- перехід до п.26.
Порівняти результат з одиницею.
Якщо при порівнянні отримали нуль, то виграли - перехід до п.28.
Знайти оптимальний хід та значення функції виграшу для противника(рекурсивний виклик цієї підпрограми).
Інвертувати отриману функцію виграшу противника.
Збільшити результат на одиницю з метою переводу у від'ємне число.
Перевірити, чи зроблений хід кращий за попередні: порівняти результат змаксимальним значенням функції виграшу у «Н».
Перехід до п. 19, якщо цей хід не кращий (Н>А).
Подія: знайшли нове максимальне значення функції виграшу, яке треба зберегти в «Н».
Запам'ятати в «L» кількість сірників, що спробували брати, і яка привела до кращого ходу
Продовження перебору ходів: зменшуємо кількість сірників, яку будемо пробуватибрати (вміст «В»).
Якщо результат зменшення не нуль, то повторити процес з п.6;
Інакше підготуватись до виходу з підпрограми: витягнути зі стека регістрову пару«ВС».
Переслати знайдене максимальне значення функції виграшу в акумулятор.
Переслати в «D» кількість сірників, яка відповідає знайденому максимальному значеннюфункції виграшу.
Витягнути зі стека регістрову пару «НL».
Повернутись з підпрограми.
Програв: встановити в акумуляторі значення функції виграшу, яке дорівнює #81.
Продовжувати пошук. Перейти до п. 15.
Виграв: підготуватись до закінчення пошуку ходу - завантажити в»Н» максимальнезначення функції виграшу, яке дорівнює #83.
Переслати в «L» кількість взятих сірників, що привели до виграшу.
Перейти до закінчення пошуку - п.21.
Головна програма
Завантажити в акумулятор кількість сірників, що залишились на столі після: N-го ходу.
Знайти оптимальний хід (викликати підпрограму).
Підготуватись до виводу ходу - завантажити у акумулятор код програмування інтерфейсу.
Запрограмувати інтерфейс для виводу на світлодіоди.
5. З регістра «D» переслати у акумулятор кількість взятих програмою сірників (оптимальний хід).
Вивести отримане значення на світлодіоди.
Зупинити процесор.
При захисті роботи перевірити, чи дотримується програма оптимальної стратегії, пояснити в чому полягає принцип мінімакса.
Лабораторна робота №6
Тема: Обмін даними через пам'ять.
Мета: Використовуючи нижче подану демонстраційну програму перебирання сегментів, написати програму яка б виводила певну букву.
Обмін інформацією між мікропроцесорною системою та зовнішнім середовищем може здійснюватись не лише через інтерфейс вводу-виводу, а й через оперативну пам'ять. Таким чином, під час запису даних у деякі комірки пам'яті інформація одночасно може потрапляти і на пристрій вводу-виводу. У складних мікропроцесорних системах функцію передачі даних між системою і зовнішнім пристроєм, локальною мережею або іншою мікропроцесорною системою здійснює контролер прямого доступу до пам'яті, який працює паралельно з процесором.
У лабораторній роботі також є можливість здійснювати вивід через пам'ять, але без допомоги контролера ПДП. Пристроєм виводу є цифрові індикатори, звернутися до будь-якого з індикаторів можна через комірки за адресою #83Р8-#83РР. Кожен індикатор має вісім окремих сегментів, які світяться залежно від даних, які записані у вказані комірки. Стан сегменту залежного від стану відповідного біта даних. У процесі роботи потрібно запустити програму, та визначити, за який сегмент відповідає кожен біт. Після цього потрібно вивести дві букви на два довільних індикатори, використовуючи команди "МVI М "безпосереднє завантаження комірки пам'яті, адреса якої знаходиться у регістровій парі "НL.". Можливо також використати команду "SТА" прямий запис акумулятора у пам'ять за адресою яка вказана після команди.
У кожного студента повинен бути свій варіант букв. Можливі букви:
G,H,J,L,P,Q,U,B,r,n,y,b.
ДЕМОНСТРАЦІЙНА ПРОГРАМА ПЕРЕБИРАННЯ СЕГМЕНТІВ:
Адреса
Програма
Коментар
8000
МVІ С,#00
Завантажити в регістр С
8002
М3: МVІ В,#07
Завантажити в В константу, що засвічує сегменти
8004
LХІ Н,#83F8
Завантажити в регістрову пару НL адресу комірки
8007
М1: МОV А, С
Переслати в акумулятор вміст регістра С
8008
RLC
Зсув акумулятора вліво
8009
МОV С, А
Переслати в регістр С вміст акумулятора
800А
МОV М, А
Переслати байт з акумулятора в комірку пам'яті
800В
INX H
Збільшити на одиницю вміст регістрової пари НL
800С
LХІ D,#ОFFF
Завантажити в регістрову пару DЕ адресу комірки
800Р
М2: DСХ D
Зменшити на одиницю вміст регістрової пари DЕ
8010
МОV А, D
Переслати в акумулятор вміст регістрової пари DЕ
8011
ORA E
Диз'юнкція з регістром "Е"
8012
JNZ М2
Якщо не нуль, то перейти на мітку М2
8015
DCR B
Вміст регістрової пари BС зменшити на одиницю
8016
JNZ M1
Якщо не нуль, то перейти на мітку М1
8019
JMP М3
Безумовний перехід
ПРОГРАМА, ЩО ВИВОДИТЬ БУКВУ НА ІНДИКАТОР
Адреса
Програма
Коментар
8100
М2: МVІ А,#7D
Завантажити в акумулятор константу, що засвічує сегменти
8102
SТА #83FА
Прямий запис акумулятора у пам'ять за адресою
8105
LХІ D,#0FFF
Завантажити в регістрову пару DЕ адресу комірки
8108
М1: DСХ D
Зменшити на одиницю вміст регістрової пари DЕ
8109
МОV А,D
Переслати в акумулятор вміст регістрової пари DЕ
810А
ОRА Е
Диз'юнкція з регістром "Е"
810В
JNZ M1
Якщо не нуль, то перейти на мітку М1
810Е
JМР М2
Безумовний перехід
Результати роботи
Щоб вивести на індикатор за адресою #83FА букву G, необхідно на початку завантажити в акумулятор константу 7D.
Щоб вивести на індикатор за адресою #83FВ букву Q, необхідно на початку завантажити в акумулятор константу ВF.
A
F В
E C
D H
7
6
5
4 3
2
1
0
H G F E D C B A
Буква G висвітлюється на індикаторі, коли в сегментах А, С, D, Е, F, G - 1.
0
1
1
1
1
1
0
1
0111 1101 => 7D
Буква Q висвітлюється на індикаторі, коли в сегментах А, В, С, D, Е, F, Н - 1.
1
0
1
1
1
1
1
1
1011 1111 => ВF
Додаток А
Мнемо-код команди
Задіяні регістри
Код команди
Цикл
Адресація
Байт
Коментарі
КОМАНДИ ПЕРЕСИЛАННЯ
МОV
А,А
7F
Вміст регістра А
А,В
78
В
А,С
79
С
А,D
7А
1
пряма
1
D
А,Е
7В
Е
А,Н
7С
Н
А,L
7D
L пересилається в регістр А.
В,А
47
Вміст регістра А
В,В
40
В
В,С
41
С
В,D
42
1
пряма
1
D
В,Е
43
Е
В,Н
44
Н
В,L
45
L пересилається в регістр В.
С,А
4Р
Вміст регістра А
С,В
48
В
С,С
49
С
С,D
4А
1
пряма
1
D
С,Е
4В
Е
С,Н
4С
Н
С,L
4D
L пересилається в регістр С.
D,А
57
Вміст регістра А
D,В
50
В
D,C
51
С
D,D
52
1
пряма
1
D
D,E
53
Е
D,Н
54
Н
D,L
55
L пересилається в регістр D.
Е,А
5Р
Вміст регістра А
Е,В
58
В
Е,С
59
С
Е,D
5А
1
пряма
1
D
Е,Е
5В
Е
Е,Н
5С
Н
Е,L
5D
L пересилається в регістр Е.
Н,А
67
Вміст регістра А
Н,В
60
В
Н,С
61
С
Н,D
62
1
пряма
1
D
Н,Е
63
Е
Н,Н
64
Н
Н,L
65
L пересилається в регістр Н.
L,А
6Р
Вміст регістра А
L,В
68
В
L,С
69
С
L,D
6А
1
пряма
1
D
L,E
6В
Е
L,H
6С
Н
L,L
6D
L пересилається в регістр L.
А,М
7Е
Вміст комірки пам'яті М пересилається в регістр А
B,M
46
В
C,M
4Е
С
D,M
56
2
непряма
1
D
E,M
5Е
Е
H,M
66
Н
L,M
6Е
L
М,А М,В М,С М,D М,Е М,Н М,L
77 70 71 72 73 74 75
1
пряма
1
Вміст регістра А
В
С
D
Е
Н
L пересилається в комірку пам'яті М.
КОМАНДИ БЕЗПОСЕРЕДНЬОЇ ПЕРЕСИЛКИ
МVІ
А.байт В,байт С,байт D,байт Е,байт Н,байт L,байт М,байт
3Е 06 0Е 16 1Е 26 2Е 36
2
безпосередня
2
Пересилання 16-кової константи в регістр А
В
С
D
Е
Н
L
в комірку пам'яті М.
КОМАНДИ БЕЗПОСЕРЕДНЬОГО ЗАВАНТАЖЕННЯ РЕГІСТРІВ
LХІ
В,2 байта D,2 байта Н,2 байта SР,2байта
01 11
21 31
5
безпосередня
3
Числова шістнадцяткова команда, яка може займати 2 байти завантажується в регістрову пару ВС
DЕ
НL
стек, вказівник якого 8Р.
КОМАНДИ ЗАГРУЗКИ/ЗБЕРЕЖЕННЯ
LDАХ
В
D
H
0А
1А
7Е
2
непряма
1
Вміст комірки пам'яті, адреса якої вказана в парі регістрів ВС
DЕ
НL пересилається в акумулятор.
LНLD
[адреса]
2А
4
3
Вміст комірки пам'яті, адреса якої вказана в другому або третьому байтах команди, пересилається в регістр L. Вміст комірки пам'яті з наступною адресою ((адр.)+1) пересилається в регістр Н
LDA
[адреса]
ЗА
4
непряма
3
Вміст комірки пам'яті, адреса якої вказана в другому або третьому байтах команди, завантажується в акумулятор.
SТАХ
В
D
02 12
2
непряма
2
Вміст акумулятора пересилається в комірку пам'яті, адреса якої встановлений в парі регістрів ВС DЕ.
SHLD
[адреса]
22
5
безпосередня
3
Вміст регістра L пересилається в комірку пам'яті, адреса якої вказана в другому і третьому байтах команди. Вміст регістра Н пересилається в наступну комірку пам'яті.
SТА
[адреса]
32
4
безпосередня
3
Вміст акумулятора пересилається в комірку пам'яті, адреса якої вказана в другому і третьому байтах команди.
КОМАНДИ ДОДАВАННЯ
АDD
А В
C
D
Е
Н
L
М
87 80 81 82 83 84 85 86
2
непряма
1
До вмісту акумулятора додаємо вміст регістру А
В
С
D
Е
H
L
комірки пам'яті М, адреса якої міститься а регістрі НL, і результат в акумуляторі.
АDС
А
В
C
D
Е
Н
L М
8Е 88 89 8А 8В 8С 8D 8Е
1
непряма
1
Додавання з переносом, до вмісту акумулятора додаємо вміст регістру А
В
С
D
Е
H
L
комірки пам'яті М, адреса якої міститься в регістрі НL, і біт основного переносу від попередньої операції.
АDI
байт
С6
2
безпосередня
2
Числова константа додається до вмісту акумулятора, результат операції в акумуляторі.
АСI
байт
СЕ
2
безпосередня
2
Числова константа додається до вмісту акумулятора і біт основного переносу від попередньої операції, результат операції в акумуляторі.
КОМАНДИ ІНКРЕМЕНТ
INR
А
В
C
D
Е
Н
L
M
3С
04
0С
14
1С
24
2С
34
1
Вміст регістра А
В
С
D
Е
Н
L
комірки пам'яті, адреса якої міститься в регістрі НL
збільшити на 1.
непряма
1
INX
B
D
H
SР
03
13
23
33
1
непряма
1
На одиницю збільшуємо регістрову пару ВС
DЕ
НL
вміст стеку вказівник якого SР.
КОМАНДИ
ДЕКРЕМЕНТ
DCR
А
В
C
D
Е
Н
L
М
3D
05
0D
15
1D
25
2D
35
1
непряма
1
Зменшення вмісту регістра А
В
С
D
Е
Н
L
вмісту комірки пам'яті М, адреса якої міститься в
регістрі НL, на 1.
DCX
В
D
H
SР
0B
1B
2В
3B
1
непряма
1
Зменшення вмісту регістрової пари ВС
DЕ
НL
вмісту стеку, вказівник якого SР на 1.
ПОДВІЙНЕ
ДОДАВАННЯ
DAD
В
D
Н
SР
09
19
29
39
3
непряма
1
Вміст пари регістрів BС
DЕ
НL
Вміст стеку, вказівник якого SР,
додається до вмісту регістрів Н і L . Результат
поміщається в пару регістрів Н , L.
КОМАНДИ
ВІДНІМАННЯ
SUB
А
В
C
D
Е
Н
L
М
97
90
91
92
93
94
95
96
1
непряма
1
Від вмісту акумулятора відняти вміст регістра А
В
С
D
Е
Н
L
вміст комірки пам'яті М, адреса якої знаходиться в
регістрі НL, а результат в акумуляторі.
SBB
А
В
С
D
Е
H
L
М
9F
98
99
9А
9В
9С
9D
9Е
1
непряма
1
Від вмісту акумулятора відняти вміст регістра А
В
С
Е
Н
L
вміст комірки пам'яті М, адреса якої знаходиться в
регістрі НL і 1 позички , віднімаємо біт СУ регістра ознак,
а результат в акумуляторі.
SUI
Байт
D6
2
безпосе-
редня
2
Від вмісту акумулятора віднімаємо шістнадцяткову
константу від вмісту акумулятора.
SBI
Байт
DЕ
2
безпосе-
редня
2
Від вмісту акумулятора віднімаємо шістнадцяткову
константу і біт основного переносу СУ регістра ознак від
вмісту акумулятора.
КОМАНДИ ПОРОЗРЯДНОГО ЛОГІЧНОГО «І»
АNA
А В
C
D
Е
Н
L
М
А7 А0
А1 А2 АЗ А4 А5 А6
1
непряма
1
Виконується над вмістом акумулятора і регістром А В
С
D
Е
Н
L,
вмістом комірки пам'яті М незалежно в кожному розряді, без переносів, а результат в акумуляторі.
АNI
байт
Е6
1
безпосередня
1
Виконується над вмістом акумулятора і шістнадцятковою константою незалежно в кожному розряді, без переносів, а результат в акумуляторі.
КОМАНДИ ПОРОЗРЯДНОГО ЛОГІЧНОГО «АБО»
ОRА
А В С D Е Н L М
В7 ВО В1 В2 ВЗ В4 В5 В6
1
непряма
1
Виконується над вмістом акумулятора і регістром А
В
С
D
Е
Н
L
вмістом комірки пам'яті М незалежно в кожному розряді, без переносів, а результат в акумуляторі.
ОRІ
байт
Р6
2
безпосе редня
2
Виконується над вмістом акумулятора і шістнадцятковою константою незалежно в кожному розряді, без переносів, а результат в акумуляторі.
КОМАНДИ СУМА ПО МОD 2
ХRА
А В С
D
Е Н L
M
АР А8 А9 АА АВ АС АDАЕ
1
непряма
1
Виконується над вмістом акумулятора і регістром А
В
С
D
Е
Н
L
вмістом комірки пам'яті М незалежно в кожному розряді, без переносів, а результат в акумуляторі.
ХRІ
байт
ЕЕ
2
безпосередня
1
Виконується над вмістом акумулятора і шістнадцятковою константою незалежно в кожному розряді, без переносів, а результат в акумуляторі.
СМР
А В С
D
Е Н L
ВF В8 В9 ВА ВВ ВС ВD
1
1
Вміст регістра А
В
С
D
Е
Н
L порівнюється з вмістом акумулятора.
СМР
M
ВЕ
2
1
Вміст комірки пам'яті, адреса якої знаходиться в регістровій парі НL, порівнюється з вмістом акумулятора.
СРІ
байт
FЕ
2
1
Вміст другого байта команди порівнюється з вмістом акумулятора.
КОМАНДИ ЗСУВУ
RLC
07
1
1
Вміст акумулятора зсувається вліво на одну позицію.
Вміст найстаршого біту заноситься в молодший біт і біт прапорця переносу. Команда діє лише на прапорець переносу СУ.
RRC
ОF
1
1
Вміст акумулятора зсувається вправо на одну позицію.
Вміст молодшого біту заноситься в старший біт і біт прапорця переносу. Команда діє лише на прапорець переносу СУ.
RAL
17
1
1
Вміст акумулятора зсувається вліво на одну позицію через біт переносу СУ. Молодший біт стає рівний прапорцю переносу, а біт прапорця переносу СУ - рівний величині старшого біта акумулятора . Команда діє лише на прапорець переносу СУ.
RАR
1F
1
1
Вміст акумулятора зсувається вправо на одну позицію через біт переносу СУ. Старший біт акумулятора стає рівний прапорцю переносу, а прапорець переносу СУ -рівний молодшому біту акумулятора . Команда використовує лише прапорець переносу СУ.
СПЕЦІАЛЬНІ КОМАНДИ
DАА
27
1
1
Команда десяткової корекції. 8-бітне число в акумуляторі доповнюється до представлення в вигляді двох 4-бітних чисел в двійково-десятковому коді за допомогою таких операцій:
якщо число, яке представлене чотирма молодшими бітами акумулятора, більше 8 або встановлено прапорець переносу АС, то до вмісту акумулятора додається 6.
якщо тепер число представляється чотирма старшими бітами акумулятора, більше 9 або встановлений прапорець переносу СУ, то число 6 додаємо до числа, яке створене чотирма бітами акумулятора.
Використовуються всі прапорці.
СМА
2F
1
1
Вміст акумулятора інвертується (біт, рівний 1, стає рівним 0; біт, рівний 0, стає рівним 1). Прапорці не використовуються.
SТС
37
1
1
Біт прапорця переносу встановлюється в 1, інші прапорці не використовуються.
СМС
3F.
1
1
Інвертується біт прапорця переносу СУ. Інші прапорці не використовуються.
КОМАНДИ ПЕРЕХОДІВ
JMP
[адреса]
C3
3
3
Безумовний перехід на комірку пам'яті з вказаною адресою
JNZ
[адреса]
С2
3
і
Перехід по ненулю, то наступна команда, яка буде виконана це та, яка вказана в команді переходу, в іншому випадку виконається команда, яка іде наступною за командою переходу
JZ
[адреса]
СА
3
3
Перехід по нулю, то наступна команда, яка буде виконана це та, яка вказана в команді переходу, в іншому випадку виконається команда, яка іде наступною за командою переходу
JNC
[адреса]
D2
3
Перехід по непереносу, якщо біт основного переносу регістра ознак СУ=0, то наступна команда, яка буде виконана це та, яка вказана в команді переходу, в іншому випадку виконається команда, яка іде наступною за командою переходу
JC
[адреса]
DА
3
3
Перехід по переносу, якщо біт основного переносу регістра ознак СУ=1, то наступна команда, яка буде виконана це та, яка вказана в команді переходу, в іншому випадку виконається команда, яка іде наступною за командою переходу
JPO
[адреса]
Е2
3
3
Перехід по непарності кількості одиниць на команду, яка вказана в команді переходу, в іншому випадку виконається команда, яка іде наступною за командою переходу
JPE
[адреса]
ЕА
3
3
Перехід по парності кількості одиниць на команду, яка вказана в команді переходу, в іншому випадку виконається команда, яка іде наступною за командою переходу
JP
[адреса]
F2
3
3
Перехід по плюсу ( тобто аналізується 7-й біт акумулятора) на команду, яка вказана в команді переходу, в іншому випадку виконається команда, яка іде наступною за командою переходу
JM
[адреса]
FА
3
3
Перехід по мінусу ( тобто аналізується 7-й біт акумулятора) на команду, яка вказана в команді переходу, в іншому випадку виконається команда, яка іде наступною за командою переходу
РСНL
[адреса]
Е9
3
3
Завантаження в РС вмісту регістрової пари НL, потім перехід на адресу, яка зберігається в регістровій парі НL
КОМАНДИ ВИКЛИКУ ПІДПРОГРАМ
САLL
[адреса]
CD
5
2
Безумовний виклик підпрограми. Старші 8 біт адреси
наступної команди пересилаються в комірку пам'яті, адреса якої на 1 менша вмісту вказівника СТЕКУ SР. Молодші 8 біт адреси наступної команди пересилаються в комірку пам'яті, адреса якої на 2 менша від величини показника СТЕКУ SР. Вміст вказівника СТЕКУ зменшується на 2. управління передається команді, адреса якої вказана в 2 і 3 байтах команди виклику.
CNZ
[адреса]
С4
5
2
Виклик підпрограми по ненулю. Якщо вказана умова істинна, то виконуються дії, описані в команді САLL, в протилежному випадку послідовність команд не зміниться.
СZ
[адреса]
СС
5
2
Виклик підпрограми по нулю. Якщо вказана умова істинна, то виконуються дії, описані в команді САLL, в протилежному випадку послідовність команд не зміниться.
CNC
[адреса]
D4
5
2
Виклик підпрограми по непереносу, СУ=О. Якщо вказана умова істинна, то виконуються дії, описані в команді САLL, в протилежному випадку послідовність команд не зміниться.
СС
[адреса]
DС
5
2
Виклик підпрограми по основному переносу, СУ=1.
Якщо вказана умова істинна, то виконуються дії, описані в команді САLL, в протилежному випадку послідовність команд не зміниться.
СРО
[адреса]
Е4
5
2
Виклик підпрограми по непарності. Якщо вказана умова істинна, то виконуються дії, описані в команді САLL, в протилежному випадку послідовність команд не зміниться.
СРЕ
[адреса]
ЕС
5
2
Виклик підпрограми по парності. Якщо вказана умова істинна, то виконуються дії, описані в команді САLL, в протилежному випадку послідовність команд не зміниться.
СР
[адреса]
F4
5
2
Виклик підпрограми якщо додатне значення старшого біту акумулятора. Якщо вказана умова істинна, то виконуються дії, описані в команді САLL, в протилежному випадку послідовність команд не зміниться. Команда виконується за 5 циклів.
CM
[адреса]
FС
5
2
Виклик підпрограми якщо від'ємне значення старшого біту акумулятора. Якщо вказана умова істинна, то виконуються дії, описані в команді САLL, в протилежному випадку послідовність команд не зміниться.
КОМАНДИ ПОВЕРНЕННЯ 3 ПІДПРОГРАМИ
RЕТ
С9
3
1
Безумовне повернення з підпрограми. Вміст комірки пам'яті, адреса якої міститься і вказівнику СТЕКУ SР, пересилаються в 8 молодших біт програмного лічильника РС. Вміст комірки пам'яті, адреса якої на 1 більша вмісту вказівника СТЕКУ, пересилається в 8 старших біт програмного лічильника. Вміст вказівника СТЕКА збільшується на 2.
RNZ
СО
3
1
Вихід з підпрограми по ненулю. Якщо вказана умова істинна, то виконуються дії, описані в команді RET, в протилежному випадку послідовність команд не зміниться.
RZ
С8
3
1
Вихід з підпрограми по нулю. Якщо вказана умова...