Міністерство освіти і науки, молоді та спорту України
Прикарпатський національний університет
імені Василя Стефаника
Кафедра радіофізики і електроніки
Лабораторна робота №3
Арифметичні команди восьмирозрядного мікропроцесора КР580ВМ80 (Intel 8080).
Івано-Франківськ – 2011
1. Мета роботи
Вивчити основні типи арифметичних і логічних команд та послідовність їх виконання восьмирозрядним мікропроцесором, навчитися створювати програми з їх використанням.
2. Обладнання
Програма - емулятор мікропроцесорної системи на базі одно-кристального КР580ВМ80.
3. Короткі відомості з теорії
3.1. Арифметичні команди.
Якими б потужними та складними пристроями не рахували комп'ютери, всі вони побудовані на основі мікропроцесорів, які можуть виконувати тільки найпростіші арифметичні та логічні операції. До них відноситься операції ДОДАВАННЯ та ВІДНІМАННЯ. Такі операції, як МНОЖЕННЯ та ДІЛЕННЯ реалізуються програмним методом за допомогою операцій ДОДАВАННЯ, ВІДНІМАННЯ та деяких інших логічних операцій. В загальному випадку операція ВІДНІМАННЯ зводиться до операції ДОДАВАННЯ числа, записаного в оберненому коді, однак реалізація віднімання таким способом вимагає значних програмних витрат (збільшує довжину коду програми та ускладнює її).
Мікропроцесор КР580ВМ80 може виконувати операції ДОДАВАННЯ над 8-ми та 16-ти розрядними двійковими числами. Операції ВІДНІМАННЯ застосовні тільки до 8-ми розрядних чисел.
Виконання арифметичних команд впливає на значення регістру стану (прапорцевого регістру)
Регістр стану (прапорцевий регістр) – регістр, який містить 5 двійкових розрядів, що називаються прапорцями, і які містять спеціальні ознаки результатів деяких операцій. Часом його називають регістром ознак, або регістром бітів умов. Регістр містить такі прапорці: прапорець нуля (Z - zero), прапорець перенесення (C - carry), прапорець знаку (S - sign), прапорець парності (P - parity) та прапорець додаткового перенесення (AC – auxiliary carry). Прапорці завжди встановлюються чи скидаються автоматично після виконання наступної команди, яка впливає на прапорці, в залежності від результату операції. Прапорець вважається встановленим, якщо відповідний розряд регістра набуває значення 1, і скидається, якщо значення розряду 0. Стани прапорців використовують в командах умовного переходу. Результати виконання арифметичних і логічних операцій над вмістом акумулятора, регістрів загального призначення та комірок пам’яті впливають на прапорці наступним чином:
Прапорець нуля встановлюється в 1, якщо в результаті виконання якої-небудь команди отримано нульовий результат (всі біти задіяного регістру чи комірки пам’яті встановлено в 0) і скидається в 0 в випадку ненульового результату.
Прапорець перенесення встановлюється в 1, якщо в результаті операцій додавання та зсуву появляється одиниця перенесення зі старшого розряду байта даних, а також, якщо виконується запозичення зі старшого розряду після виконання операцій віднімання чи порівняння. В іншому випадку прапорець скидається в 0.
Прапорець знаку встановлюється в 1, якщо в результаті виконання операцій появляється одиниця в старшому розряді байту даних (вказує на від’ємний результат) і скидається в 0 в випадку нульового значення старшого розряду (вказує на додатній результат).
Прапорець парності встановлюється в 1, якщо після виконання операцій сума одиниць в байті даних парна (значення суми по модулю 2 рівне 0) і скидається в 0, якщо кількість одиниць непарна.
Прапорець додаткового перенесення встановлюється в 1, якщо в результаті виконання команди появляється одиниця перенесення з третього розряду байта даних в четвертий і скидається в 0, якщо такого перенесення нема. Прапорець додаткового перенесення використовується в багатьох схемах обчислень, однак він особливо необхідний для додавання чисел в двійково-десятковій формі.
Деякі з арифметичних команд можуть враховувати значення окремих прапорців стану, які були встановлені в результаті виконання попередніх операцій. До таких команд належить додавання з врахуванням попереднього перенесення, та команди, що працюють з двійково-десятковими числами.
3.1.1. 8-ми розрядні додавання та віднімання.
Всі 8-ми розрядні додавання здійснюються за допомогою акумулятора А. Це означає, що один із операндів обов'язково повинен міститися в регістрі А. Другий із операндів може бути адресований одним із трьох видів адресації: безпосередньою, регістровою та непрямою. Пряма адресація операнда не використовується в даному мікропроцесорі, однак може бути реалізована в інших. Результат додавання завжди записується в акумулятор А. Іншими словами процесор виконує додавання шляхом збільшення значення акумулятора А, що містить один доданок, на величину другого доданку, який може знаходитися в одному із регістрів мікропроцесора, або комірці зовнішньої (оперативної) пам'яті, або безпосередньо в наступному байті команди. Слід пам'ятати, що попереднє значення акумулятора А втрачається. Це необхідно враховувати в випадку розробки програм та забезпечувати зберігання проміжних значень акумулятора в разі потреби.
В випадку 8-ми розрядних віднімань зменшуване завжди повинно міститися в акумуляторі А. Від'ємник адресується аналогічно, як це здійснюється у випадку додавання. Різниця записується в акумулятор А.
Додавання та віднімання 8-ми розрядних чисел без врахування попереднього перенесення продемонстровано на наступних прикладах.
Додавання: Сума доданків не перевищує 256:
1.
2.
Додавання: Сума доданків перевищує 256:
В результаті виконання такого додавання буде встановлено прапорець перенесення С (С = 1). В регістр А буде записано число, яке менше суми на 256d.
Віднімання: Зменшуване більше від'ємника.
Віднімання: Зменшуване менше від'ємника.
В результаті виконання такого віднімання буде встановлено прапорець перенесення С (С = 1). Це еквівалентно запозиченню одиниці молодшого розряду старшого байта (якщо такий є). Слід зауважити, що в регістр А буде записане число 11100011b, що дорівнює числу 29d, записаному в доповненому коді.
8-ми розрядні додавання та віднімання без врахування попереднього перенесення реалізуються за допомогою таких команд, як:
1
Додавання до акумулятора
2
безпосередня
3
ADI, B2
4
А + B2 → А
5
С6h
306q
6
Команда займає 2 байта пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, які містяться в другому байті програми, додаються до значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
1
Віднімання від акумулятора
2
безпосередня
3
SUI, B2
4
А - B2 → А
5
D6h
326q
6
Команда займає 2 байта пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, які містяться в другому байті програми, віднімаються від значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
1
Додавання до акумулятора
2
регістрова
3
ADD r
4
А + r → А
5
80h - 85h, 87h
20Sq (S ≠ 6)
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 4 такти.
7
Під час виконання команди дані, які містяться в регістрі за номером S, додаються до значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
Номер S береться з Табл.1. Лабораторна робота 2.
1
Віднімання від акумулятора
2
регістрова
3
SUB r
4
А - r → А
5
90h - 95h, 97h
22Sq (S ≠ 6)
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 4 такти.
7
Під час виконання команди дані, які містяться в регістрі за номером S, віднімаються від значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
Номер S береться з Табл.1. Лабораторна робота 2.
1
Додавання до акумулятора
2
непряма
3
ADD М
4
А + М(HL) → А
5
86h
206q
6
Команда займає 1 байт пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, що містяться в комірці пам'яті, адреса якої знаходиться в регістровій парі HL, додаються до значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
Перед виконанням команди командою ADD М необхідно завантажити пару HL адресою комірки, де міститься другий доданок.
1
Віднімання від акумулятора
2
непряма
3
SUB М
4
А - М(HL) → А
5
86h
206q
6
Команда займає 1 байт пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, що містяться в комірці пам'яті, адреса якої знаходиться в регістровій парі HL, віднімаються від значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
Перед виконанням команди командою SUB М необхідно завантажити пару HL адресою комірки, де міститься від'ємник.
Можна помітити, що найшвидше виконуються команди додавання та віднімання з використанням одного із регістрів загального призначення, оскільки безпосередня та непряма адресації вимагають додаткового звернення до пам'яті.
3.1.2. Додавання та віднімання з врахуванням попереднього перенесення.
Команди 8-розрядного додавання та віднімання можна використовувати в випадку чисел, довжина яких складає більш ніж 8 біт. Такі числа використовують для двійкового представлення чисел, значно більших 256d. Наприклад:
Кількість байтів (бітів)
Максимальне десяткове число
1
28-1, 255
2
216-1, 65535
3
224-1, 16777215
4
232-1, 4294967295
і т.д.
Додавати такі числа можна побайтно, однак слід враховувати перенесення з старшого розряду молодшого байту суми в молодший розряд наступного за старшинством байту. В випадку віднімання необхідно враховувати запозичення з молодшого розряду старшого байту. Розглянемо такий приклад:
Додати числа 30315d та 13802d. Записавши числа в двійковій системі числення та виконуючи побітне додавання можна побачити, що під час додавання молодших байтів виникає перенесення в молодший розряд суми старших байтів.
старший байт
перенесення
молодший байт
1-й доданок
0
1
1
1
0
1
1
0
0
1
1
0
1
0
1
1
2-й доданок
0
0
1
1
0
1
0
1
1
1
1
0
1
0
1
0
сума без перенесення
1
0
1
0
1
0
1
1
1
0
1
0
1
0
1
0
1
перенесення
1
←
сума з перенесенням
1
0
1
0
1
1
0
0
0
1
0
1
0
1
0
1
Якщо здійснювати додавання звичайним способом, то необхідно було б спочатку додати два старших байти, а потім до результату додати значення перенесення, оскільки команда додавання оперує тільки двома доданками. Однак для полегшення роботи програміста існує тип команд ДОДАВАННЯ З ПЕРЕНЕСЕННЯМ за допомогою яких можна додавати одразу три числа: два доданки та перенесення, отримане в попередній операції додавання. Важливо зауважити, що додаткове додавання перенесення здійснюється апаратним способом і не впливає на кількість тактів команд.
1
Додавання до акумулятора з урахуванням попереднього перенесення
2
безпосередня
3
ACI, B2
4
А + B2 + С→ А
5
СЕh
316q
6
Команда займає 2 байта пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, які містяться в другому байті програми, та біт перенесення С додаються до значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
1
Додавання до акумулятора з урахуванням попереднього перенесення
2
регістрова
3
ADC r
4
А + r + С→ А
5
88h - 8Dh, 8Fh
21Sq (S ≠ 6)
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 4 такти.
7
Під час виконання команди дані, які містяться в регістрі за номером S, та біт перенесення С додаються до значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
Номер S береться з Табл.1. Лабораторна робота 2.
1
Додавання до акумулятора з урахуванням попереднього перенесення
2
непряма
3
ADC М
4
А + М(HL) + С→ А
5
8Еh
216q
6
Команда займає 1 байт пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, що містяться в комірці пам'яті, адреса якої знаходиться в регістровій парі HL, та біт перенесення С додаються до значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
Перед виконанням команди командою ADD М необхідно завантажити пару HL адресою комірки, де міститься другий доданок.
Аналогічно можна розглянути віднімання двох чисел з запозиченням. Нехай це будуть ті ж числа 30315d та 13802d. Під час віднімання молодших байтів виникає необхідність запозичення одиниці молодшого розряду старшого байту:
старший байт
запозичення
молодший байт
зменшуване
0
1
1
1
0
1
1
0
0
1
1
0
1
0
1
1
від'ємник
0
0
1
1
0
1
0
1
1
1
1
0
1
0
1
0
різниця без запозичення
0
1
0
0
0
0
0
1
1
1
0
0
0
0
0
0
1
запозичення
1
→
сума з запозичення
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
Віднімання звичайним способом також вимагає здійснення його в два етапи: спочатку знайти різницю двох байтів, а потім від неї відняти значення запозичення. Принципової різниці між перенесенням та запозиченням немає, оскільки операцію віднімання мікропроцесор реалізує шляхом додавання до зменшуваного числа від'ємника в доповненому коді. Тому для полегшення роботи програміста існують команди ВІДНІМАННЯ З ПЕРЕНЕСЕННЯМ. Як і у випадку ДОДАВАННЯ З ПЕРЕНЕСЕННЯМ, додаткове віднімання перенесення не впливає на час виконання команд (кількість тактів).
1
Віднімання від акумулятора з урахуванням попереднього перенесення
2
безпосередня
3
SBI, B2
4
А - B2 - С→ А
5
DЕh
336q
6
Команда займає 2 байта пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, які містяться в другому байті програми, та біт перенесення С віднімаються від значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
1
Віднімання від акумулятора з урахуванням попереднього перенесення
2
регістрова
3
SBB r
4
А - r - С→ А
5
98h - 9Dh, 9Fh
23Sq (S ≠ 6)
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 4 такти.
7
Під час виконання команди дані, які містяться в регістрі за номером S, та біт перенесення С віднімаються від значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
Номер S береться з Табл.1. Лабораторна робота 2.
1
Віднімання від акумулятора з урахуванням попереднього перенесення
2
непряма
3
SBB М
4
А - М(HL) - С→ А
5
9Еh
236q
6
Команда займає 1 байт пам'яті, виконується за 2 цикли, 7 тактів.
7
Під час виконання команди дані, що містяться в комірці пам'яті, адреса якої знаходиться в регістровій парі HL, та біт перенесення С віднімаються від значення акумулятора А. Результат записується в акумулятор А.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
Перед виконанням команди командою SUB М необхідно завантажити пару HL адресою комірки, де міститься від'ємник.
3.1.3. 16-ти розрядні додавання.
Мікропроцесор КР580ВМ80 має спеціальні команди для додавання 16-ти розрядних чисел. Використання цих команд дозволяє спростити написання програм, а також зменшити час їх виконання. В деяких випадках 16-ти розрядні числа можна розглядати як адреси комірок пам'яті, а операції додавання над цими адресами як обчислення зміщених відносно базових адрес комірок підпрограм та даних. Наприклад, деяка підпрограма займає в пам'яті 50 байтів коду та 20 байт зарезервованого місця для зберігання проміжних результатів обчислень. Якщо ця підпрограма буде використовувати фіксовані адреси комірок пам'яті, то може виникнути ситуація, коли її використання призведе до затирання певних даних конкретної програми. Тому в програмі використовується базова адреса, за якою в пам'яті розміщується перша комірка підпрограми, а адреси інших команд та комірок даних підпрограми обчислюються за зміщенням відносно базової адреси.
Додавання 16-розрядних чисел здійснюється аналогічно, як і 8-ми розрядних, однак прапорець перенесення встановлюється в випадку, якщо в результаті додавання виникає перенесення з старшого розряду старшого байта суми. ДОДАВАННЯ З ПЕРЕНЕСЕННЯМ 16-ти розрядних чисел мікропроцесор КР580ВМ80 не підтримує, тому використовуючи команди 16-ти розрядного додавання до більш, ніж двобайтних чисел, слід враховувати перенесення (запозичення) програмним способом.
16-ти розрядні додавання здійснюються за допомогою регістра HL. Це означає, що один із доданків (операндів) повинен міститися в регістрі HL, туди ж записується результат операції. Другий з доданків може міститися в одному із 16-ти розрядних регістрів BC, DE, HL або SP, тобто адресація другого операнда завжди регістрова.
16-ти розрядних команд додавання всього чотири DAD B, DAD D, DAD H та DAD SP.
1
16-ти розрядне додавання
2
регістрова/регістрова
3
DAD B (DAD D; DAD H; DAD SP)
4
HL + BC → HL
(HL + DE → HL; HL + HL → HL; HL + SP → HL)
5
09h (19h, 29h, 39h)
011q (031q, 051q, 071q)
6
Команда займає 1 байт пам'яті, виконується за 3цикли, 10 тактів.
7
Під час виконання команди дані, які містяться в регістровій парі BC (DE, HL, SP) додаються до значення регістрової пари HL. Результат записується в регістрову пару HL.
8
Результат виконання команди впливає тільки на прапорець перенесення.
3.1.4. Додавання в двійково-десятковому коді. Десяткова корекція.
Наявність команди десяткової корекції дозволяє мікропроцесору виконувати додавати числа, записані в двійково-десятковому коді, як звичайні двійкові числа. Чому необхідний двійково-десятковий код? Відповідь на це питання пов'язане з областю застосування мікропроцесорів. Як правило їх використовують в простих системах необчислювального характеру, для яких характерне введення та виведення інформації в двійково-десятковому коді. Це можуть бути різного виду вимірювальні прилади з виведенням результатів на табло, створене на основі семисегментних знакоіндикаторів.
Сутність двійково-десяткового коду полягає в заміні кожної десяткової цифри її чотирибітним двійковим представленням:
0
0000
4
0100
8
1000
1
0001
5
0101
9
1001
2
0010
6
0110
3
0011
7
0111
Тоді число 3709d можна записати як 0011011100001001bd
Перетворення двійково-десяткового числа в десятковий здійснюється шляхом розбиття його на четвірки бітів зліва направо і заміною кожної четвірки її десятковим представленням. Таким чином за допомогою 1 байту можна представити всі дворозрядні десяткові числа від 00d (00000000bd) до 99d (10011001bd).
Необхідність корекції результатів додавання в двійково-десятковому коді виникає внаслідок того, що мікропроцесор інтерпретує двійково-десяткові числа як звичайні двійкові числа, а тетрадам 1010, 1011, 1100, 1101, 1110 та 1111 не відповідає жодна десяткова цифра.
Розглянемо можливі варіанти додавання двох однорозрядних десяткових чисел X та Y в двійково-десятковому коді.
X + Y ≤ 9 - результат правильний, корекція непотрібна, перенесення в наступну тетраду відсутнє. Наприклад 0001 + 0011 = 0100.
9 < X + Y ≤ 15 - результат невірний оскільки не може бути інтерпретованим, потрібна корекція, перенесення в наступну тетраду відсутнє. Наприклад 0110 + 0111 = 1101.
15 < X + Y ≤ 18 - результат невірний, число можна інтерпретувати як десяткове, але його значення відрізняється від дійсного, потрібна корекція, є перенесення в наступну тетраду. Наприклад 1000 + 1001 = 1 0001
Корекція здійснюється шляхом додавання числа 6 (0110) у випадку, якщо перенесення відсутнє, а результат додавання перевищує 9, або у випадку, якщо було перенесення в наступну тетраду. Оскільки одним байтом можна кодувати дворозрядне десяткове число, необхідно контролювати перенесення з молодшої тетради в старшу. Для цього існує прапорець додаткового перенесення АС, який встановлюється в 1 в випадку перенесення з третього розряду в четвертий.
Наприклад необхідно додати числа 1889d та 6376d. Кожне з чисел може бути представлене за допомогою 2 байтів: 00011000bd, 10001001bd та 01100011bd, 01110110bd.
В результаті додавання отриманий результат переводимо в десяткову систему: 8265d. Перевіримо:
1889
6376
------
8265
Десяткова корекція здійснюється за допомогою команди DAA. Однак вона застосовна тільки до операції 8-ми розрядного додавання. В випадку 16-ти розрядних додавань, та 8-ми розрядних віднімань її реалізують програмними засобами.
1
Десяткова корекція акумулятора А
2
регістрова
3
DAА
4
(Десяткова корекція А) → А
5
27h
047q
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 4 такти.
7
Під час виконання команди 8-ми розрядне слово, яке містяться в акумуляторі А, перетворюється в два чотирибітних двійково- десяткові числа наступним чином:
1) Якщо величина молодших чотирьох бітів акумулятора більше 1001, або якщо встановлено прапорець АС=1, то до значення цих бітів додається число 0110.
2) Якщо тепер величина старших чотирьох бітів акумулятора більше 1001, або якщо встановлено прапорець С=1, то до значення цих бітів додається число 0110.
8
Всі прапорці стану встановлюються в відповідності з результатом операції.
УВАГА! Команда DAA на жаль не реалізована в емуляторі мікропроцесора КР580ВМ80, а спроба її виконання призводить до "зависання" роботи емулятора.
3.1.4. Команди приросту.
Команди додатного (increment) та від'ємного (decrement) приросту є спеціальними арифметичними командами. Виконання команд додатного приросту приводить до збільшення значення відповідного регістру чи регістрової пари на 1. Аналогічно команди від'ємного приросту зменшують значення регістру чи пари на 1. Дані команди використовуються в ситуаціях, коли необхідно підрахувати кількість деяких подій, які виконуються з повтором.
Команда декременту часто використовується для встановлення того факту, що певна частина програми була виконана задану кількість разів. Можна, звичайно, використати команду інкременту, однак після виконання тіла циклу необхідно перевіряти, чи відповідає число здійснених повторів заданій величині. Така перевірка здійснюється за допомогою команди порівняння, і займає додаткову пам'ять програми. Використовуючи команду декременту можна реалізувати цикл простіше, оскільки кількість повторів задається в деякому регістрі, а після виконання кожного повтору зменшується на одиницю. Далі програма перевіряє цей регістр на нульовий результат відповідно до прапорця нуля. Якщо всі повтори виконано, в регістрі - нульове значення, прапорець нуля встановлено в 1, то програма виходить із циклу та виконує наступну за циклом команду.
Команди інкременту, як правило, використовуються для організації масивів даних. В такому випадку задається початкова адреса першої комірки пам'яті, яка записується в регістрову пару HL. Звертання до комірок пам'яті здійснюється, таким чином, за допомогою непрямої адресації. Застосовуючи команду інкременту до регістрової пари HL, можна адресуватися до наступного байту масиву.
1
Інкремент (додатній приріст) регістру
2
регістрова
3
INR r
4
r + 1 → r
5
04h, 0Ch, 14h, 1Ch, 24h, 2Ch, 3Ch
0D4q (D ≠ 6)
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 5 тактів.
7
Під час виконання команди вміст регістру за номером D збільшується на 1.
8
Всі прапорці стану за винятком прапорця перенесення встановлюються в відповідності з результатом операції.
Номер D береться з Табл.1. Лабораторна робота 2.
1
Декремент (від'ємний приріст) регістру
2
регістрова
3
DCR r
4
r - 1 → r
5
05h, 0Dh, 15h, 1Dh, 25h, 2Dh, 3Dh
0D5q (D ≠ 6)
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 5 тактів.
7
Під час виконання команди вміст регістру за номером D зменшується на 1.
8
Всі прапорці стану за винятком прапорця перенесення встановлюються в відповідності з результатом операції.
Номер D береться з Табл.1. Лабораторна робота 2.
1
Інкремент (додатній приріст) комірки пам’яті
2
непряма
3
INR М
4
М(H, L) + 1 → М(H, L)
5
34h
064q
6
Команда займає 1 байт пам'яті, виконується за 3 цикли, 10 тактів.
7
Під час виконання команди вміст комірки пам'яті, адреса якої знаходиться в регістровій парі HL, збільшується на 1.
8
Всі прапорці стану за винятком прапорця перенесення встановлюються в відповідності з результатом операції.
Перед інкрементом комірки пам'яті за допомогою команди INR М необхідно завантажити пару HL адресою комірки.
1
Декремент (від'ємний приріст) комірки памяті
2
непряма
3
DCR М
4
М(H, L) - 1 → М(H, L)
5
35h
065q
6
Команда займає 1 байт пам'яті, виконується за 3 цикли, 10 тактів.
7
Під час виконання команди вміст комірки пам'яті, адреса якої знаходиться в регістровій парі HL, зменшується на 1.
8
Всі прапорці стану за винятком прапорця перенесення встановлюються в відповідності з результатом операції.
Перед декрементом комірки пам'яті за допомогою команди DCR М необхідно завантажити пару HL адресою комірки.
1
Інкремент (додатній приріст) регістрової пари
2
регістрова
3
INХ B (INХ D; INХ H; INХ SP)
4
BC + 1 → BC
(DE + 1 → DE; HL + 1 → HL; SP + 1 → SP)
5
03h (13h, 23h, 33h)
003q (023q, 043q, 063q)
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 5 тактів.
7
Під час виконання команди вміст регістрової пари BC (DE, HL, SP) збільшується на 1
8
Виконання команди не впливає на регістр стану.
1
Декремент (від'ємний приріст) регістрової пари
2
регістрова
3
DCХ B (DCХ D; DCХ H; DCХ SP)
4
BC - 1 → BC
(DE - 1 → DE; HL - 1 → HL; SP - 1 → SP)
5
0Bh (1Bh, 2Bh, 3Bh)
013q (033q, 053q, 073q)
6
Команда займає 1 байт пам'яті, виконується за 1 цикл, 5 тактів.
7
Під час виконання команди вміст регістрової пари BC (DE, HL, SP) зменшується на 1
8
Виконання команди не впливає на регістр стану.
4. Порядок виконання експериментів.
Запустіть емулятор.
Експеримент 1. Виконання простих команд 8-ми розрядного додавання даних. Розглянемо приклади до розділу 3.1.1.
Виконайте наведені нижче приклади програм в потактовому режимі. Зафіксуйте, скільки циклів та тактів займає виконання кожної із програм. Зафіксуйте значення прапорця перенесення після виконання кожної із команд.
1. Додавання без врахування попереднього перенесення. Сума доданків не перевищує 256. Додати числа 12d та 41d.
Введіть таку програму:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
3Е
MVI А, d8
дані наступної комірки ОЗП → регістр А
0001
0С
INR C
дані 0Ch → регістр А
0002
06
MVI В, d8
дані наступної комірки ОЗП → регістр B
0003
29
DAD H
дані 29h → регістр В
0004
80
ADD B
А + В → А
-
-
-
-
2. Додавання без врахування попереднього перенесення. Сума доданків не перевищує 256. Додати числа 55d та 67d.
Введіть таку програму:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
3Е
MVI А, d8
дані наступної комірки ОЗП → регістр А
0001
37
STC
дані 37h → регістр А
0002
0Е
MVI С, d8
дані наступної комірки ОЗП → регістр С
0003
43
MOV B, Е
дані 43h → регістр С
0004
81
ADD С
А + С → А
-
-
-
-
3. Додавання без врахування попереднього перенесення. Сума доданків перевищує 256. Додати числа 156d та 189d.
Введіть таку програму:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
3Е
MVI А, d8
дані наступної комірки ОЗП → регістр А
0001
9С
SBB H
дані 9Ch → регістр А
0002
16
MVI D, d8
дані наступної комірки ОЗП → регістр D
0003
ВD
CMP L
дані BDh → регістр D
0004
82
ADD С
А + D → А
-
-
-
-
4. Віднімання без врахування попереднього перенесення. Зменшуване більше від'ємника. Від числа 156d відняти 41d.
Введіть таку програму:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
3Е
MVI А, d8
дані наступної комірки ОЗП → регістр А
0001
9С
SBB H
дані 9Ch → регістр А
0002
1Е
MVI Е, d8
дані наступної комірки ОЗП → регістр Е
0003
29
DAD H
дані 29h → регістр Е
0004
93
SUB Е
А - Е → А
-
-
-
-
5. Віднімання без врахування попереднього перенесення. Зменшуване менше від'ємника. Від числа 12d відняти 41d.
Введіть таку програму:
Адреса комірки ОЗП
код команди
Мнемонічний запис команди
Команда мікропроцесора
0000
3Е
MVI А, d8
дані наступної комірки ОЗП → регістр А
0001
0С
INR C
дані 0Ch → регістр А
0002
26
MVI H, d8
дані наступної комірки ОЗП → регістр H
0003
29
DAD H
дані 29h → регістр H
0004
82
ADD H
А - H → А