37681

Арифметичні команди восьмирозрядного мікропроцесора КР580ВМ80 (Intel 8080)

Лабораторная работа

Информатика, кибернетика и программирование

Арифметичні команди. Прапорці завжди встановлюються чи скидаються автоматично після виконання наступної команди яка впливає на прапорці в залежності від результату операції. Результати виконання арифметичних і логічних операцій над вмістом акумулятора регістрів загального призначення та комірок пам’яті впливають на прапорці наступним чином: Прапорець нуля встановлюється в 1 якщо в результаті виконання якоїнебудь команди отримано нульовий результат всі біти задіяного регістру чи комірки пам’яті встановлено в 0 і скидається в 0 в випадку...

Украинкский

2013-09-25

465 KB

4 чел.

Міністерство освіти і науки, молоді та спорту України

Прикарпатський національний університет

імені Василя Стефаника

Кафедра радіофізики і електроніки

Лабораторна робота №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) та прапорець додаткового перенесення (ACauxiliary 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

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 + DEHL;   HL + HLHL;   HL + SPHL)

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

MVI А, d8

дані наступної комірки ОЗП → регістр А

0001

INR C

дані 0Ch → регістр А

0002

06

MVI В, d8

дані наступної комірки ОЗП → регістр B

0003

29

DAD H

дані 29h → регістр В

0004

80

ADD B

А + В → А

-

-

-

-

2. Додавання без врахування попереднього перенесення. Сума доданків не перевищує 256. Додати числа 55d та 67d.

Введіть таку програму:

Адреса комірки ОЗП

код команди

Мнемонічний запис команди

Команда мікропроцесора

0000

MVI А, d8

дані наступної комірки ОЗП → регістр А

0001

37

STC

дані 37h → регістр А

0002

0Е

MVI С, d8

дані наступної комірки ОЗП → регістр С

0003

43

MOV B, Е

дані 43h → регістр С

0004

81

ADD С

А + С → А

-

-

-

-

3. Додавання без врахування попереднього перенесення. Сума доданків перевищує 256. Додати числа 156d та 189d.

Введіть таку програму:

Адреса комірки ОЗП

код команди

Мнемонічний запис команди

Команда мікропроцесора

0000

MVI А, d8

дані наступної комірки ОЗП → регістр А

0001

SBB H

дані 9Ch → регістр А

0002

16

MVI D, d8

дані наступної комірки ОЗП → регістр D

0003

ВD

CMP L

дані BDh → регістр D

0004

82

ADD С

А + D → А

-

-

-

-

4. Віднімання без врахування попереднього перенесення. Зменшуване більше від'ємника. Від числа 156d відняти 41d.

Введіть таку програму:

Адреса комірки ОЗП

код команди

Мнемонічний запис команди

Команда мікропроцесора

0000

MVI А, d8

дані наступної комірки ОЗП → регістр А

0001

SBB H

дані 9Ch → регістр А

0002

MVI Е, d8

дані наступної комірки ОЗП → регістр Е

0003

29

DAD H

дані 29h → регістр Е

0004

93

SUB Е

А - Е → А

-

-

-

-

5. Віднімання без врахування попереднього перенесення. Зменшуване менше від'ємника. Від числа 12d відняти 41d.

Введіть таку програму:

Адреса комірки ОЗП

код команди

Мнемонічний запис команди

Команда мікропроцесора

0000

MVI А, d8

дані наступної комірки ОЗП → регістр А

0001

0С

INR C

дані 0Ch → регістр А

0002

26

MVI H, d8

дані наступної комірки ОЗП → регістр H

0003

29

DAD H

дані 29h → регістр H

0004

82

ADD H

А - H → А

-

-

-

-

Зробіть висновки.

Експеримент 2. Виконання простих команд 16-ти розрядного додавання даних.

Попередньо занесіть такі числа в регістри:

B = 11, С = 22, D = 33, E = 44, H = 55, L = 66, SP = 0080.

Введіть таку програму:

Адреса комірки ОЗП

код команди

Мнемонічний запис команди

Команда мікропроцесора

0000

09

DAD B

HL + BC → HL

0001

19

DAD D

HL + DE → HL

0002

29

DAD H

HL + HL → HL

0003

39

DAD SP

HL + SP → HL

-

-

-

-

Прослідкуйте за значеннями прапорця перенесення С.

Зробіть висновки.

Експеримент 3. Додавання з урахуванням попереднього перенесення.

Завдання: необхідно додати 2 чотирибайтніі числа 12889513h та 32С2В0ААh. Оскільки регістрів загального призначення не вистачить, то розмістимо дані в пам'яті. Туди ж будемо записувати суму. Нехай 1-й доданок займає в пам'яті адреси починаючи з 0030h, 2-й доданок - починаючи з 0035 h, суму будемо записувати починаючи з 003Аh. В такому разі адресу першого доданку запишемо в регістровій парі ВС, другого - в HL, суми - в DE.

Попередньо необхідно занести числа в пам'ять.

Адреса комірки ОЗП

1-й доданок

Адреса комірки ОЗП

2-й доданок

0030

13

0035

АА

0031

95

0036

В0

0032

88

0037

С2

0033

12

0038

32

Байти заносяться в пам'ять згідно принципу: Старші байти в комірки з більшою адресою.

Введемо та виконаємо програму.

Адреса комірки ОЗП

код команди

Мнемонічний запис команди

Команда мікропроцесора

0000

01

LXI B, d16

0030h → BC

0001

30

-

0002

00

NOP

0003

11

LXI D, d16

003Ah → HL

0004

3A

LDA adr

0005

00

NOP

0006

21

LXI H, d16

0035h → DE

0007

35

DCR M

0008

00

NOP

0009

0A

LDAX B

M(BC) → A

000А

86

ADD M

A + M(HL) → A

000В

12

STAX D

A → M(DE)

000С

03

INX B

BC + 1 → BC

000D

13

INX D

DE + 1 → DE

000E

23

INX H

HL + 1 → HL

000F

0A

LDAX B

M(BC) → A

0010

8E

ADC M

A + M(HL) + C→ A

0011

12

STAX D

A → M(DE)

0012

03

INX B

BC + 1 → BC

0013

13

INX D

DE + 1 → DE

0014

23

INX H

HL + 1 → HL

0015

0A

LDAX B

M(BC) → A

0016

8E

ADC M

A + M(HL) + C→ A

0017

12

STAX D

A → M(DE)

0018

03

INX B

BC + 1 → BC

0019

13

INX D

DE + 1 → DE

001A

23

INX H

HL + 1 → HL

001B

0A

LDAX B

M(BC) → A

001C

8E

ADC M

A + M(HL) + C→ A

001D

12

STAX D

A → M(DE)

001E

76

HLT

Зупинка програми

-

-

-

-

Перевірте результат виконання програми в комірках пам'яті починаючи з адреси 003Аh. Перевірте правильність додавання та врахування перенесень. Зробіть висновки.

5. Контрольні запитання.

1. Основні типи арифметичних команд та їх призначення.

2. Які із видів адресації використовують арифметичні команди?

3. Перерахуйте прапорці регістра стану. За яких умов вони встановлюються в 0 або 1?

4. На які прапорці впливає результат виконання арифметичних команд?

5. Які із видів адресації використовують арифметичні команди?

6. З якою метою використовуються команди додавання з перенесенням та віднімання з запозиченням. На скільки циклів та тактів вони довші ніж аналогічні арифметичні команди без урахування перенесення. Чому?

7. В яких випадках використовують команди 16-ти розрядного додавання? Чи можна їх використовувати в випадку додавання більш, ніж двобайтних чисел? Відповідь обґрунтуйте.

8. Де повинні знаходитись операнди та результат в випадку використання команд 8-ми розрядного додавання та віднімання. В випадку 16-ти розрядного додавання?

9. Яким чином можна здійснити віднімання 16-ти розрядних чисел?

10. Яким чином здійснюється представлення чисел в двійково-десятковому коді? Наведіть приклади використання такого коду.

11. З якою метою використовується команда десяткової корекції?

12. Чи можна застосовувати команду десяткової корекції до результату віднімання двох чисел? Відповідь обґрунтуйте.

13. Які команди інкременту - декременту здійснюються в мікропроцесорі КР580ВМ80? Яку адресацію використовують ці команди, та на які прапорці стану впливає результат їх виконання?

14. Наведіть приклади використання команди інкременту.

15. З якою метою, як правило, використовують команди від'ємного приросту?

16.* Складіть програму додавання двох двобайтних чисел в двійково-десятковому коді без використання команди десяткової корекції

        Десяткова      двійкова     шістнадцяткова

Зменшуване:     12    00001100    0С

Від'ємник:     41    00101001    29

   ——  —————  ——

Різниця:    -29    11100011    Е3

Результат в регістрі А 227    11100011    Е3

Перенесення

(запозичення) С    1    1     1

        Десяткова      двійкова     шістнадцяткова

Зменшуване:   156    10011100    9С

Від'ємник:     41    00101001    29

   ——  —————  ——

Різниця:   115    01110011    73

Результат в регістрі А 115    01110011    73

Перенесення

(запозичення) С    0    0     0

Доданок 1. Молодший байт     1 0 0 0  1 0 0 1

Доданок 2. Молодший байт     0 1 1 1  0 1 1 0

        --------  --------

Сума         1 1 1 1  1 1 1 1

Десяткова корекція       0 1 1 0  0 1 1 0

          --------

                  1   ← 0 1 0 1

        ---------

               1    ← 0 1 1 0

Доданок 1. Старший байт  0 0 0 1  1 0 0 0

Доданок 1. Старший байт  0 1 1 0  0 0 1 1

    --------  --------

Сума    0 1 1 1  1 1 0 0

Десяткова корекція   0 0 0 0  0 1 1 0

      --------

             1   ← 0 0 1 0

    --------

    1 0 0 0

Результат додавання:  1 0 0 0  0 0 1 0  0 1 1 0  0 1 0 1

        Десяткова      двійкова     шістнадцяткова

1-й доданок:     55    00110111    37

2-й доданок:     67    01000011    43

   ——  —————  ——

Сума:    122    01111010    7A

Результат в регістрі А 122    01111010    7A

Перенесення

(запозичення) С    0    0     0

        Десяткова      двійкова     шістнадцяткова

1-й доданок:   156    10011100    9С

2-й доданок:   189    10111101    BD

   ——  —————  ——

Сума:    345  101011001    59

Результат в регістрі А   89    01011001    59

Перенесення

(запозичення) С    1    1     1

        Десяткова      двійкова     шістнадцяткова

1-й доданок:     12    00001100    0С

2-й доданок:     41    00101001    29

   ——  —————  ——

Сума:      53    00110101    35

Результат в регістрі А   53    00110101    35

Перенесення

(запозичення) С     0    0     0


 

А также другие работы, которые могут Вас заинтересовать

72884. Экологические проблемы АЭС. Охрана окружающей среды 65.5 KB
  Иллюзия о безопасности ядерной энергетики была разрушена после нескольких больших аварий в Великобритании США и СССР апофеозом которых стала катастрофа на чернобыльской АЭС. При этом в отношении чернобыльского выброса многое остается неизвестным и риск здоровью населения от аварийных...
72885. Экологические проблемы ГЭС и способы их решения 61 KB
  ГЭС выполняют различные функции в общей системе энергообеспечения. ГЭС сокращают потребность в газомазутными топливе использование которого в качестве сырья в других отраслях промышленности химии металлургии дает значительно больший экономический эффект.
72886. Вредные выбросы ТЭС и методы их снижения 62.5 KB
  Методы химической очистки газов от NOХ бывают: окислительные основанные на окислении оксида азота в диоксид с последующим поглощением различными поглотителями; восстановительные основанные на восстановлении оксида азота до азота и кислорода с применением катализаторов...
72887. Экологические проблемы при добыче и переработке твердого топлива 62.5 KB
  Эти прогнозные оценки исходят из экономически извлекаемых запасов угля на самом деле их значительно больше. Прогнозные запасы угля доступного к разработке оцениваются в 25 3 трлн. Если исходить из современной ежегодной мировой добычи угля примерно 3 млрд. тонн то его хватит на 1000 лет...
72888. Радиоактивный газ радон и правила защиты от его воздействия 60 KB
  Радон это инертный тяжелый газ в 75 раз тяжелее воздуха который высвобождается из почвы повсеместно или выделяется из некоторых строительных материалов например гранита пемзы кирпича из красной глины. Продукты распада радона радиоактивные изотопы свинца висмута...
72889. Биологическое действие продуктов радиоактивности. Нормирование ионизирующих излучений и способы защиты от них 68 KB
  Степень биологического влияния ионизирующего излучения зависит от поглощения живой тканью энергии и ионизации молекул которая возникает при этом. Под влиянием ионизирующего излучения в организме нарушаются функции кровотворних органов растет хрупкость и проницаемость сосудов...
72890. Экспозиционная доза. Поглощенная доза. Предельно допустимая доза. Эквивалентная доза 63.5 KB
  Экспозиционная доза.Основная характеристика взаимодействия ионизирующего излучения и среды — это ионизационный эффект. В начальный период развития радиационной дозиметрии чаще всего приходилось иметь дело с рентгеновским излучением, распространявшимся в воздухе.
72891. Радиоактивное загрязнение окружающей среды. Виды ионизирующих излучений. Единицы измерения 63 KB
  Особое место среди загрязняющих окружающую среду агентов занимают радиоактивные вещества. Внимание к нему сильно возросло после аварии на Чернобыльской АЭС в 1986 г. и ряда инцидентов на других гражданских и военных объектах с ядерным топливом.
72892. Источники инфракрасного (ИК) излучения. Тепловые загрязнения и способы борьбы с ними 66 KB
  Помимо биологических существуют также физические и химические способы очистки выбросов в атмосферу. Для этого используют прогонку через пылеуловитель действующий по принципу мокрой очистки или применяют распыление воды на мелкие капли в так называемых скруберах...