Міністерство освіти і науки, молоді та спорту України
Прикарпатський національний університет
імені Василя Стефаника
Кафедра радіофізики і електроніки
Лабораторна робота №2
Команди пересилання даних восьмирозрядного мікропроцесора КР580ВМ80 (Intel 8080).
Івано-Франківськ – 2011
1. Мета роботи
Вивчити основні типи команд пересилання даних та послідовність їх виконання восьмирозрядним мікропроцесором, навчитися створювати програми з їх використанням.
2. Обладнання
Програма - емулятор мікропроцесорної системи на базі одно-кристального КР580ВМ80.
3. Короткі відомості з теорії
3.1. Команди пересилання даних та способи адресації, які вони використовують.
Команди пересилання даних використовуються мікропроцесором для передавання даних в різні пристрої зберігання інформації, які є в його розпорядженні, як в регістри, так і в комірки оперативної пам'яті. Розрізняють такі типи команд: завантаження, пересилання регістр - регістр, запис в пам'ять та зчитування з пам'яті (пересилання пам'ять - регістр).
Команди пересилання даних фактично є командами копіювання даних, оскільки під час виконання команди дані, які містить джерело, не руйнуються. Код операції в команді пересилання даних задає джерело даних S (Source), приймач даних D (Destination) і спосіб їхньої адресації (Коди джерел та приймачів даних наведено в Табл.1). Мікропроцесор КР580ВМ80, як відомо, використовує чотири види адресації: безпосередню, пряму, регістрову та непряму. Кожен із видів адресації може бути використаний як для джерела так і для приймача даних. З шістнадцяти можливих комбінацій в мікропроцесорі КР580ВМ80 для команд завантаження даних використовується сім:
безпосередня / регістрова
безпосередня / непряма
регістрова / регістрова
регістрова / пряма
регістрова / непряма
пряма / регістрова
непряма / регістрова
S/D
код
S/D
код
Регістр B
000b / 0q
Регістр H
100b / 4q
Регістр C
001b / 1q
Регістр L
101b / 5q
Регістр D
010b / 2q
Память M
110b / 6q
Регістр E
011b / 3q
Регістр A
111b / 7q
Таблиця 1. Коди джерел та приймачів даних.
Безпосередня адресація використовується в тому випадку, коли необхідно завантажити початкові дані в регістри або пам'ять, чи константи, які будуть використовуватися на протязі роботи програми. Безпосередня адресація є зручною, наочною і може використовуватись для початкової розробки програми. Недоліком є те, що програми, написані з її використанням не мають достатньо гнучкості, а саме: для того, щоби змінити значення констант або початкових даних, необхідно переписувати код програми. Також недоліком є те, що програмний код займає більше комірок пам'яті (2, або 3) та виконується за більше циклів (2 або 3), ніж в випадку регістрової адресації. Безпосередня адресація часто використовується для завантаження одного з регістрів початковим значенням кількості циклів, які необхідно виконати, та наступним зменшенням значення регістра на 1 після виконання тіла циклу.
Регістрова адресація використовується головним чином для пересилання проміжних даних які виникають в процесі роботи програми. Пересилання між регістрами займають найменше часу (1 цикл, 4 або 5 тактів), тому їх використовують для скорочення часу виконання програм. Програмний код займає найменше пам'яті, що теж є перевагою даного виду адресації. Недоліком регістрової адресації є те, що кількість регістрів для зберігання проміжних даних є обмежена (6 однобайтних B, C, D, E, H, L), що недостатньо для роботи навіть не дуже складних програм. Тому одним із принципів розробки перспективних процесорів RISC є вимога наявності великої кількості однотипних регістрів.
Пряма адресація використовується тоді, коли кількість проміжних даних перевищує кількість наявних внутрішніх регістрів. Як правило, програміст виділяє під зберігання вхідних, проміжних та вихідних даних програми деяку область оперативної пам'яті, яка не повинна перекриватись з областю програмного коду та областю стека. Якщо таке перекриття відбувається, то результат дії програми неможливо передбачити. Область даних оперативної пам'яті в такому випадку чітко визначається кількістю змінних програми, тому мови високого рівня, які написані, в основному, на мові асемблера чи машинному коді, вимагають попереднього оголошення змінних на початку роботи програми. Область даних програми зручно розміщувати в тілі програми, для того щоби завантаження підпрограм зі зміщеним кодом не перекривалось з цією областю. Незважаючи на те, що пряма адресація вимагає трибайтних команд, та додаткових двох циклів для завантаження адреси комірки пам'яті + 1 цикл завантаження даних з комірки пам'яті, використання її є більш ефективним, ніж використання непрямої адресації, для якої спочатку слід забезпечити занесення адреси комірки пам'яті в відповідну пару регістрів.
Непряма адресація використовується в основному для роботи з областю стеку, а також для зберігання та завантаження даних в/з суміжних комірок пам'яті, які використовуються для організації масивів. За допомогою непрямої адресації також можна організовувати масиви змінної довжини типу вказівник або список. Програмний код з командами, які використовують непряму адресацію займає менше місця, є достатньо гнучким та зручним для перенесення на інші процесори. В випадку організації списків чи вказівників, необхідно чітко слідкувати за тим, щоби кількість байтів, занесених в пам'ять, завжди рівнялась кількості вибраних, в іншому випадку результат дії програми буде непередбачуваним.
В таблиці 1. лабораторної роботи №1 всі команди пересилання даних відмічені оранжевим (однобайтові пересилання) та жовтим (двобайтові пересилання) кольорами.
3.2. Машинні цикли мікропроцесора КР580ВМ80.
Команди в КР580ВМ80 виконуються як послідовність внутрішніх мікрокоманд. Кожна з мікрокоманд виконується на протязі одного циклу, тривалість якого складає 3-5 тактів. Кількість машинних циклів та загальна кількість тактів визначається типом команди. Всього є 10 типів машинних циклів:
вибірка команди;
зчитування слова з запам'ятовуючого пристрою
запис слова в запам'ятовуючий пристрій
зчитування слова зі стеку
запис слова в стек
зчитування слова з пристрою введення/виведення
запис слова в пристрій введення/виведення
підтвердження переривання
підтвердження зупинки
підтвердження переривання під час зупинки.
Перший цикл завжди є цикл вибірки команди і займає 4 або 5 тактів. Три наступних цикли завжди виконуються за три такти, а п'ятий за три або п'ять тактів. З огляду на це завжди можна розрахувати кількість циклів і тактів команди, якщо відомо способи адресації, які вона використовує.
Наприклад: команда MVI М, B2 двобайтова, використовує безпосередню/непряму адресацію. Під час виконання команди дані, які містяться в другому байті програми, завантажуються в комірку пам'яті, адреса якої знаходиться в регістровій парі HL. Перший цикл - вибірка першого байта з пам'яті (4 або 5 тактів), наступний - вибірка другого байта (3 такти). Ще один цикл - запис даних в комірку пам'яті (3 такти). Отже команда виконується за 3 цикли 10 або 11 тактів. (насправді 10 тактів).
3.3.Команди пересилання мікропроцесора КР580ВМ80.
Команди мікропроцесора КР580ВМ80 зручно вивчати згідно такої схеми:
1
Назва
2
Способи адресації, які використовує команда
3
Мнемонічна форма запису
4
Дії, які виконує команда в формі логічних символів
5
Машинний код команди в
шістнадцятковій системі
вісімковій системі
6
Довжина команди, кількість циклів, кількість тактів
7
Опис дій команди
8
Дія результату виконання команди на регістр станів мікропроцесора
Увага! Наведена схема відноситься не тільки до даної лабораторної роботи, але і до наступних робіт з вивчення системи команд мікропроцесора КР580ВМ80.
3.3.1. Команди завантаження.
1
Завантаження регістра
2
безпосередня / регістрова
3
MVI r, B2
4
B2 → r
5
06h, 16h, 26h, 0Eh, 1Eh, 2Eh, 3Eh
0D6q (D ≠ 6)
6
Команда займає 2 байта пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, які знаходяться в другому байті програми, завантажуються в регістр за номером D.
8
Виконання команди не впливає на регістр стану.
Номер D береться з Табл.1. Наприклад для регістра Е код 011b, або 3q. Тому команда завантаження регістра Е числом, наприклад 3Ah, виглядає таким чином: MVI Е, 3A = 1Е, 3А, або в вісімковій системі числення
чи в шістнадцятковій системі числення
1
Завантаження регістрової пари BC (DE, HL)
2
безпосередня / регістрова
3
LXI B, B2, B3 (LXI D, B2, B3; LXI H, B2, B3)
4
B3 → B, B2 → C (B3 → D, B2 → E; B3 → H, B2 → L)
5
01h (11h; 21h)
001q (021q; 041q)
6
Команда займає 3 байти пам'яті, виконується за 3 цикли, 10 тактів.
7
Під час виконання команди третій байт команди записується в регістр B (D, H), другий байт команди записується в регістр C (E, L).
8
Виконання команди не впливає на регістр стану.
1
Завантаження регістра SP - вказівника стеку
2
безпосередня / регістрова
3
LXI SP, B2, B3
4
B3, B2 → SP
5
31h
061q
6
Команда займає 3 байти пам'яті, виконується за 3 цикли, 10 тактів.
7
Під час виконання команди другий (молодший) та третій (старший) байти команди записується в регістр SP.
8
Виконання команди не впливає на регістр стану.
Команда LXI SP буде детально розглядатись в лабораторній роботі по вивченню стеку і команд роботи з ним.
1
Завантаження комірки пам'яті
2
безпосередня / непряма
3
MVI М, B2
4
B2 → М(H, L)
5
36h
066q
6
Команда займає 2 байта пам'яті, виконується за 3 цикли, 10 тактів.
7
Під час виконання команди дані, які містяться в другому байті програми, завантажуються в комірку пам'яті, адреса якої знаходиться в регістровій парі HL.
8
Виконання команди не впливає на регістр стану.
Перед завантаженням комірки пам'яті командою MVI М, B2 необхідно завантажити пару HL адресою комірки.
3.3.2. Команди пересилання регістр-регістр
1
Пересилання з регістра в регістр
2
регістрова / регістрова
3
MОV r1, r2
4
r2 → r1
5
40h-45h, 47h-4Dh, 4Fh
50h-55h, 57h-5Dh, 5Fh
60h-65h, 67h-6Dh, 6Fh
78h-7Dh, 7Fh
1DSq (D ≠ 6, S ≠ 6)
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 5 тактів.
7
Під час виконання команди дані, які містяться в регістрі за номером S пересилаються в регістр за номером D.
8
Виконання команди не впливає на регістр стану.
Номери D та S беруться з Табл.1. аналогічно, як і для команди MVI r, B2.
1
Обмін даними між регістрами HL та DE
2
регістрова / регістрова
3
XCHG
4
H ↔ D, L ↔ E
5
EBh
353q
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 4 такти.
7
Під час виконання команди регістри H, L обмінюються даними з регістрами D, E.
8
Виконання команди не впливає на регістр стану.
1
Завантаження регістра SP - вказівника стеку
2
регістрова / регістрова
3
SPHL
4
HL → SP
5
F9h
371q
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 5 тактів.
7
Під час виконання команди дані, які містяться регістрі HL завантажуються у вказівник стеку SP.
8
Виконання команди не впливає на регістр стану.
Команда SPHL буде детально розглядатись в лабораторній роботі по вивченню стеку і команд роботи з ним.
1
Завантаження лічильника команд PC (непрямий перехід)
2
регістрова / регістрова
3
PCHL
4
HL → PC
5
E9h
351q
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 5 тактів.
7
Під час виконання команди дані, які містяться в регістрі L пересилаються в молодший байт лічильника команд РС, а дані, які містяться в регістрі H - в старший байт. Керування передається команді, яка буде занесена в PC.
8
Виконання команди не впливає на регістр стану.
Команда PCHL фактично є командою безумовного переходу і до команд пересилання даних віднесена завдяки подібності порядку виконання.
3.3.3. Команди запису в пам'ять
1
Пересилання з регістра в пам'ять
2
регістрова / непряма
3
MОV М, r
4
r → М(H, L)
5
70h - 75h, 77h
16Sq (S ≠ 6)
6
Команда займає 1 байт пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, які містяться в регістрі за номером S пересилаються в комірку пам'яті, адреса якої знаходиться в регістровій парі HL.
8
Виконання команди не впливає на регістр стану.
Перед пересиланням в комірку пам'яті командою MОV М, r необхідно завантажити пару HL адресою комірки.
1
Збереження акумулятора
2
регістрова / пряма
3
STA, B2, B3
4
A → М(B3, B2)
5
32h
062q
6
Команда займає 3 байта пам'яті, виконується за 4 цикли, 13 тактів.
7
Під час виконання команди дані, які містяться в акумуляторі А, пересилаються в комірку пам'яті, адреса якої знаходиться в другому та третьому байтах команди. (B2 - молодший байт адреси, B3 - старший байт адреси)
8
Виконання команди не впливає на регістр стану.
1
Збереження акумулятора
2
регістрова / непряма
3
STAX B (STAX D)
4
A → М(B, C) (A → М(D, E))
5
02h (12h)
002q (022q)
6
Команда займає 1 байт пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, які містяться в акумуляторі А, пересилаються в комірку пам'яті, адреса якої знаходиться в регістровій парі BC (DE). (B (D) - старший байт адреси, C (E) - молодший байт адреси)
8
Виконання команди не впливає на регістр стану.
Перед збереженням в комірку пам'яті командою STAX B (STAX D) необхідно завантажити відповідну регістрову пару адресою комірки.
1
Збереження регістрової пари HL
2
регістрова / пряма
3
SHLD, B2, B3
4
L → M(B3, B2), H → M(B3, B2+1)
5
22h
042q
6
Команда займає 3 байти пам'яті, виконується за 5 цикли, 16 тактів.
7
Під час виконання команди дані, які містяться в регістрі L пересилаються в комірку пам'яті, адреса якої знаходиться в другому та третьому байтах команди. Дані, які містяться в регістрі H пересилаються в наступну комірку пам'яті. (B2 - молодший байт адреси, B3 - старший байт адреси)
8
Виконання команди не впливає на регістр стану.
3.3.4. Команди зчитування з пам'яті
1
Пересилання з пам'яті в регістр
2
непряма / регістрова
3
MОV r, М
4
М (H, L)→ r
5
46h, 56h, 66h, 4Еh, 5Еh, 6Еh, 7Еh
1D6q (D ≠ 6)
6
Команда займає 1 байт пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, які містяться в комірці пам'яті, адреса якої знаходиться в регістровій парі HL, пересилаються в регістр за номером D.
8
Виконання команди не впливає на регістр стану.
1
Завантаження акумулятора
2
пряма / регістрова
3
LDA, B2,B3
4
М(B3, B2) → A
5
3Ah
072q
6
Команда займає 3 байта пам'яті, виконується за 4 цикли, 13 тактів.
7
Під час виконання команди дані, які містяться в комірці пам'яті, адреса якої знаходиться в другому та третьому байтах команди, пересилаються в акумулятор А.. (B2 - молодший байт адреси, B3 - старший байт адреси)
8
Виконання команди не впливає на регістр стану.
1
Завантаження акумулятора
2
непряма / регістрова
3
LDAX B (LDAX D)
4
М(B, C)→ A (М(C, E)→ A)
5
0Ah (1Ah)
012q (032q)
6
Команда займає 1 байт пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, які містяться в комірці пам'яті, адреса якої знаходиться в регістровій парі BC (DE), пересилаються в акумулятор А.. (B (D) - старший байт адреси, C (E) - молодший байт адреси)
8
Виконання команди не впливає на регістр стану.
1
Завантаження регістрової пари HL
2
пряма / регістрова
3
LHLD, B2, B3
4
M(B3, B2) → L, M(B3, B2+1) → H
5
2Ah
051q
6
Команда займає 3 байти пам'яті, виконується за 5 циклів, 16 тактів.
7
Під час виконання команди дані, які містяться в комірці пам'яті, адреса якої знаходиться в другому та третьому байтах команди, пересилаються в регістр L. В регістр H пересилаються дані наступної комірки пам'яті. (B2 - молодший байт адреси, B3 - старший байт адреси)
8
Виконання команди не впливає на регістр стану.
До наведеного списку команд не ввійшли команди роботи зі стеком, які будуть вивчатися в одній із наступних лабораторних робіт.
4. Порядок виконання експериментів.
Запустіть емулятор.
Експеримент 1. Виконання простих команд завантаження та пересилання даних.
Виконайте наведені нижче приклади програм в потактовому режимі. Зафіксуйте, скільки циклів та тактів займає виконання кожної із програм.
1. Завантаження регістра В числом 3Fh за допомогою команди MVI В, 3Fh
Введіть таку програму:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
06
MVI B, d8
дані наступної комірки ОЗП → регістр B
0001
3F
CMC
дані 3Fh → регістр В
-
-
-
-
2. Завантаження регістрової пари DE двобайтним числом 3А76h за допомогою команди LXI D, 76h, 3Аh
Введіть таку програму:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
11
MVI B, d8
дані наступних двох комірок ОЗП → регістр DE
0001
76
HLT
дані 76h → регістр E
0002
3А
LDA adr
дані 3Ah → регістр D
-
-
-
-
3. Завантаження комірки пам'яті за адресою 000Bh числом A6h за допомогою команди MVI М, А6h
Задайте початкові значення регістрів H=00; L=0В.
Введіть таку програму:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
36
MVI М, d8
дані наступної комірки ОЗП → комірка ОЗП за адресою 000Bh
0001
A6
АНА М
дані A6h → регістр E
-
-
-
-
4. Пересилання даних з одного регістра в інший (наприклад з В в Е) за допомогою команди MОV Е, В
Задайте початкові значення регістра В=55
Введіть таку програму:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
58
MОV Е, В
дані регістру В → регістр Е
-
-
-
-
5. Обмін даними між регістрами HL та DE за допомогою команди XCHG. Задайте початкові значення регістрів D=55; E=66; H=07; L=0E.
Введіть таку програму:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
EB
XCHG
регістр H ↔ регістр D
регістр L ↔ регістр Е
-
-
-
-
Зробіть висновки.
Експеримент 2. Створення масиву даних в пам'яті за допомогою команд пересилання даних.
Завдання: Створити в пам'яті масив даних згідно таблиці 2.:
Таблиця 2.
Адреса
Значення
Адреса
Значення
Адреса
Значення
1020h
ААh
1024h
А2h
1028h
9Аh
1021h
А8h
1025h
А0h
1029h
98h
1022h
А6h
1026h
9Еh
1023h
А4h
1027h
9Сh
Звісно, можна створити програму, яка буде записувати дані в комірку пам'яті:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
3E
MVI A, d8
дані наступної комірки ОЗП → регістр А
0001
AA
дані АА
0002
32
STA
регістр А → комірка ОЗП за адресою 1020
0003
10
20
молодший байт адреси
0004
2E
10
старший байт адреси
цей фрагмент програми необхідно повторити для всіх значень таблиці
-
-
-
-
Така програма має той недолік, що фрагмент запису числа в регістр А та перезапису його в пам'ять буде повторюватись стільки разів, скільки даних містить масив.
Неважко замітити, що послідовність значень являє собою арифметичну прогресію з показником -2. Тому необхідно виконати такі пересилання:
АА-2×і → M(HL+i) для всіх і = 0...10.
Для написання програми нам потрібні деякі команди, які детальніше будуть розглядатися в наступних лабораторних роботах. Це арифметичні команди:
DCR A (DCR B) - зменшення значення регістру A (B) на одиницю;
INX H - збільшення значення регістрової пари HL на одиницю;
та команди передачі керування:
JZ adr - перехід на команду програми за адресою adr в випадку, якщо в результаті арифметичних дій встановлено прапорець стану Z=1 (був нульовий результат попередніх математичних чи логічних операцій);
JMP adr - безумовний перехід на команду програми за адресою adr.
Команди DCR A, DCR B, INX H - однобайтові, результат їхнього виконання впливає на значення прапорців стану. Команди JZ adr, JMP adr - трибайтові, в другому і третьому байтах записана адреса комірки пам'яті, в якій міститься команда, що буде виконуватись наступною. Якщо Z=1 не виконана, то виконується команда, що записана наступною. Умова Z=1 може бути виконана, якщо в результаті арифметичних дій над вмістом регістрів загального призначення чи комірки пам'яті було отримано нульовий результат.
Алгоритм програми можна представити в вигляді:
Спочатку в регістри заносяться початкові дані: в А - значення АА, в В значення і - індексу масиву та в HL - адреса першої комірки масиву. Далі перевіряється значення прапорця Z. Якщо Z=0 тоді програма припиняє роботу, якщо ні - тоді значення регістру А записується в комірку пам'яті М (HL) значення регістру А зменшується на дві одиниці, значення регістрової пари HL збільшується на одиницю, значення індексу в регістрі В зменшується на одиницю. Здійснюється перехід програми на команду перевірки значення прапорця Z і т.д.
Занесіть програму в пам'ять та виконайте її.
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000h
06h
MVI B, d8
дані наступної комірки ОЗП → регістр B
0001h
0Аh
LDAX B
дані 0А
0002h
3Еh
MVI A, d8
дані наступної комірки ОЗП → регістр А
0003h
ААh
XRA d
дані АА
0004h
21h
LXI H, d16
adr → регістрова пара HL
0005h
20h
-
молодший байт адреси adr
0006h
10h
-
старший байт адреси adr
0007h
САh
JZ adr
якщо Z=1 , то перейти на адресу adr (adr → РС)
0008h
12h
STAX D
0009h
00h
NOP
команда відсутня
000Ah
77h
MOV M, A
A → M(HL)
000Bh
3Dh
DCR A
A -1 → A
000Ch
3Dh
DCR A
A -1 → A
000Dh
23h
INX H
HL + 1 → HL
000Eh
O5h
DCR B
B -1 → B
000Fh
C3h
JMP adr
перейти на адресу adr (adr → РС)
0010h
07h
RLC
молодший байт адреси adr
0011h
00h
NOP
старший байт адреси adr
0012h
76h
HLT
Зупинка програми
-
-
-
-
Перевірте значення комірок пам'яті починаючи з адреси 1020h.
Запишіть значення комірок. Зробіть висновки.
5. Контрольні запитання.
1. Призначення команд пересилання даних та їх основні типи.
2. Які із видів адресації використовують команди пересилання даних?
3. В яких випадках використовується безпосередня адресація? Її основні переваги та недоліки.
4. В яких випадках використовується регістрова адресація? Її основні переваги та недоліки
5. В яких випадках використовується пряма адресація? Її основні переваги та недоліки
6. Опишіть основні типи машинних циклів.
7. Команда LXI D, B2, B3 займає 3 байти пам'яті, виконується за 3 цикли, 10 тактів. Опишіть, які дії виконуються в кожному із машинних циклів цієї команди.
8. За допомогою яких команд пересилання можна завантажити дані в регістр А?
9. Перечисліть основні команди збереження даних в пам'ять.
10. Чому команди мікропроцесора інколи зручніше записувати в вісімковій системі числення?
11. Чи міняються значення прапорців стану, якщо пересилається число 00h?
12. Команди якого типу використовуються при створенні масивів даних та роботи з ними?
13. Яким чином можна значення комірки пам'яті переписати в іншу комірку пам'яті? Які команди для цього використовуються?
14. Чому, на Вашу думку, відсутні команди пересилання даних, які використовують такі види адресації: пряму/пряму, непряму/непряму, пряму/непряму та непряму/пряму? Відповідь обґрунтуйте.