Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab6_1.doc
Скачиваний:
4
Добавлен:
11.11.2018
Размер:
250.88 Кб
Скачать

Міністерство Освіти І НАУКИ України

Національний університет "Львівська політехніка"

Кафедра САПР

ЗВІТ

для лабораторної роботи №6

на тему:

“ АЛГОРИТМИ КОДУВАННЯ ОПЕРАЦІЙ ДОДАВАННЯ ТА ВІДНІМАННЯ ДВІЙКОВО\КОДОВАНИХ ДЕСЯТКОВИХ ЧИСЕЛ

ДЛЯ ОДНОКРИСТАЛЬНОГО МП 8080 (КР580ВМ80А). ”

З курсу: «архітектура комп’ютерів»

Виконав:

ст. гр. КН - 35

Чепак Д. М.

Прийняв:

Головацький Р.І.

ЛЬВІВ – 2010

1. Тема роботи:

Алгоритми кодування операцій додавання та віднімання двійково- десяткових кодованих чисел для однокристального МП КР580.

2. Мета роботи:

Вивчити алгоритми кодуваня операцій додавання та віднімання двійково- десяткових кодованих чисел для однокристального МП КР580, набути практичних навиків складання та налагоджування програм з використанням цих алгоритмів.

3. Індивідуальне завдання

Варіант № 71

Виконати операції над двійково-десятковими числами:

218-314+21+98. числа ввести через стек, а результат записати в акумулятор в упакованому BCD форматі.

4. Теоретичні відомості

Існують протиріччя між машинним представленням чисел (двійкова система числення) і представлення чисел у повсякденному житті (десяткові числа). Перетворення між ними у випадку великого об'єму вхідних даних і вихідних результатів веде до помітних витрат комп'ютерного часу. Тому, розроблені форми представлення чисел, в яких суміщаються двійкова і десяткова системи числення. Такі форми отримали загальну назву двійково-кодованого десяткового представлення (Binari-Coded Decimal) або BCD-кодування. У спакованому форматі, який часто називають BCD-представленням десяткових чисел, байт містить дві десяткові цифри. Молодша цифра займає праву тетраду (біти 3:0), старша - ліву тетраду (біти 7:4). Обидві цифри представляються своїм двійковим еквівалентами, тобто за допомогою 0 і 1 відповідно з вагами двійкових розрядів 8 / 4 / 2 / 1. Наприклад, десятковому числу 72 , відповідає BCD код 0111 0010 (упакований байт BCD чисел).

Набір команд арифметичних операцій чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А) містить спеціальну команду двійково-десяткової корекції акумулятора DAA (Decimal Adjust Accumulator). , Для реалізації прикладних задач в МПС виконуються арифметичні операції з застосованням команди DAA. Наприклад, при виведенні опрацьованої інформації з МПС через дешифратор (К564ИД5) BCD коду в семисегментний на рідкокристалічний індикатор.

Арифметична операція додавання чисел в BCD кодах

Арифметична операцыя додавання чисел в BCD кодах виконується в два етапи:

1. Операнди додаються як двійкові числа;

2. Виконується корекція отриманого значення командою DAA.

Десяткова корекція вмісту акумулятора командою DAA відбувається в схемі двійково-десяткової корекції мікропроцесора КР580ВМ80А. 8-розрядний код акумулятора в цій схемі коректується за таким правилом:

- якщо молодша тетрада містить число, яке більше ніж 9, або встановлено прапорець переносу AC=1, то вміст акумулятора збільшується на 6;

- якщо після цього старша тетрада містить число, яке більше ніж 9, або встановлено прапорець CY=1, то до старшої тетради додається 6.

Суть корекції полягає додаванні при необхідності до двійково-десяткового коду тетради константи 6 (0110). Це пояснюється тим, що 4-розрядна двійкова тетрада має 16 можливих кодових комбінації (від 0000 до1111), що відповідають десятковим числам від 0 до 15, а при двійково-десятковому кодуванні чисел використовується всього 10 комбінацій (від 0000 до 1001) для представлення цифр від 0 до 9. тобто шість комбінацій, більших 1001 не використовуються. В результаті додавання одиниці до коду дев'ятки (1001) треба отримати код нуля (0000) в даній тетраді та одиницю переносу в наступну тетраду. Таким чином, якщо результат суми в тетраді буде більше 9, чому відповідає одиничне значення признаку переносу з даної тетради або код, більший 1001, то для одержання вірного двійково-десяткового коду до даної тетради додається коректуючий код шістки (0110). Наприклад, проміжний результат двійкового додавання BCD-чисел 79 і 39 має такий вигляд: 0111 1001

+ 0011 1001

1011 0010 (CY=1, AC=1)

Після виконання команди DAA : 0001 1000 (CY=1), отримали результат 118.

Арифметична операція віднімання чисел в BCD кодах

Використання набору арифметико-логічних команд МП КР580ВМ80А

використовується для виконання арифметичної операції віднімання двійково-кодованих десяткових чисел. Слід зауважити, для віднімання спеціальної команди корекції нема, тобто команда DAA не корегує результат двійкового віднімання. Тому операцію віднімання (X-Y) BCD-чисел необхідно виконувати в два етапи (операції виконуються в двійковому коді):

-утворити доповнюючий BCD-код від'ємника Y за формулою :

MVI A,99h ; запис в акумулятор числа 99h

ACI 0 ; отримуєм еквівалент 100 в коді BCD

SUB M ; отримуєм доповнюючий BCD-код.

Так, для Y=63, в результаті виконання наведеної послідовності доповнюючий код буде Yдоп=(100-63)=37, а в BCD форматі 0011 0111.

Арифметична операція додавання/віднімання знакових чисел

в BCD кодах

В загальному випадку перед додаванням/відніманням необхідно проводити аналіз знаків операндів і формування при необхідності доповнюючих кодів операндів. Алгоритм додавання/віднімання BCD чисел зі знаком повинен обов'язково враховувати знаки операндів. Під знак в двійково-десятковому кодуванні відводиться старша тетрада: знаку "+" відповідає код 0000, знаку "-" код 1001. При перетворенні BCD-кодів з прямого в доповнюючий і навпаки змінюються лише цифрові розряди, знакові розряди зберігають своє значення. Однак, при безпосередньому виконанні арифметичних операцій над заковими розрядами поряд з цифровими виконуються операції додавання/віднімання і їх значення також підлягають десятковій корекції.

Наприклад, a) виконання операції над BCD-кодами 428 -316 =112,

доповнюючий BCD-код числа 316 після виконання (1) буде рівний 684:

0000 0100 0010 1000 ; +428

+1001 0110 1000 0100 ; Yдоп= -684

1001 1010 1010 1100

0110 0110 0110 ; DAA

1010 0001 0001 0010

0110 ; DAA

1 0000 0001 0001 0010

+ 1 1 2

б) виконання операції над BCD-кодами - 428 -316 = - 744,

доповнюючий BCD-код чисел 428 і 316 після виконання (1) буде віповідно рівний 572 і 684:

1001 0101 0111 0010 ; -572

+1001 0110 1000 0100 ; -316

10010 1011 1111 0110

0110 0110 0110 0000 ; DAA

11001 0010 0101 0110

- 2 5 6 , ; доповнюючий код.

Прямий код результату - (1000-256) = -744

Перетворення чисел двійково-десяткового формату в двійковий формат і з двійкового формату в BCD-коди.

Для ефективного використання множини арифметичних команд МП КР580 застосовуються алгоритми перетворення з формату BCD у двійковий формат і навпаки, так як мікропроцесор КР580ВМ80А може виконувати додавання і віднімання над двійковими і двійково-кодованими десятковими (BCD-формат) числами.

Розглянемо алгоритм переведення 8-бітного двійкового цілого беззнакового числа в упаковане двійково-кодоване десяткове число. В упакованому BCD-числі кожен байт містить по дві двійково-десяткові цифри. Нехай в акумулятор записано байт, який інтерпретується як двійкове ціле беззнакове число (діапазон від 0 до 255), і необхідно утворити в парі регістрів HL його представлення як упакованого десяткового числа. Простий спосіб полягає в тому, щоб спочатку визначити цифру сотень шляхом віднімання 100 від даного двійкового числа. Далі послідовним відніманням 10 знаходиться цифра десятків. Після цього в акумуляторі залишається цифра одиниць. Віднімання сотень і десятків виконується до отримання від'ємної різниці з підрахунком числа віднімань, після цього відновлюється залишок додаванням до від'ємної різниці 100 (або 10).

Приклад програми перетворення 8-бітного цілого беззнакового числа в упаковане двійково-десяткове число :

BBCD: MVI H,-1

L100: INR H

SUI 100

JNC L100

ADI 100

MVI L,-1

L10: INR L

SUI 10

JNC L10

ADI 10

MOV C,A

MOV A,L

RRC

RRC

RRC

RRC

ORA C

MOV L, A

HLT

Розглянем алгоритм перетворення упакованого десяткового цілого цілого беззнакового числа у двійкове. Нехай в акумуляторі знаходиться байт, який представляє упаковане двійково-десяткове число (діапазон від 0 до 99), і необхідно утворити в акумуляторі еквівалентне двійкове число. Алгоритм перетворення полягає в тому, щоб старшу тетраду акумулятора (цифру десятків) домножити на десять і додати до отриманого добутку молодшу тетраду (цифру одиниць). Найпростіше множення на 10 (в двійковому коді 1010 В) виконується шляхом множення цифри на 8 (зсув на три біти вліво) і додавання цифри, домноженої на 2 (зсув на 1 біт вліво).

Програма перетворення упакованого десяткового цілого цілого беззнакового числа у двійкове:

BCDB: MOV B,A

ZNI F0h

RRC

MOV C,A

RRC

RRC

ADD c

MOV C,A

MOV A,B

ANI 0Fh

ADD C

HLT

Yдоп = ((10k-1)-Y)+1), (1)

k-порядок BCD-чисел;

-додати отриманий двійково-десятковий код до зменшуваного : ( X+Yдоп ) ;

-скоригувати проміжний результат командою DAA.

Наприклад, для отримання доповнюючого десяткового коду дворозрядного BCD числа можна використати послідовність команд відповідно наведеної формули:

STC ; встановлення прапорця CY=1

5. Обчислення виразу 98-65-12+5 в BCD форматі.

1) 318– 314 + 21 +98 = 23

Yдоп = ( ( 10k – 1 ) – x ) + 1

(-314)доп = ( ( 1000– 1 ) – 314 ) + 1 = 35

218 0000 0010 0001 1000

- 314 (686) 1001 0110 1000 0110

1001 1000 1001 1110

0110

1001 1000 1010 0100

0110

9904(-96) 1001 1001 0000 0100

2) -96 + 21 = - 75

-96 1001 1001 0000 0100

+ 21 0000 0000 0010 0001

9925(-75) 1001 1001 0010 0101

3) -75 + 98 = 23

-75 1001 1001 0010 0101

+ 98 0000 0000 1001 1000

  1. 1001 1001 1011 1101

0110

1001 1001 1100 0011

0110

1001 1010 0010 0011

0110

1010 0000 0010 0011

0110

23 0000 0000 0010 0011

6. Текст програми

lab61.asm

lab62.asm

org 100h

lxi sp,183h

mvi l,98

push h

mvi l,21

push h

mvi h,3

mvi l,14

push h

mvi h,0

mvi l,218

push h

mov a,l

call perevid

xchg

shld 183h

lhld 17dh

call dopov

mov h,d

mov l,e

shld 185h

mvi e,0

mvi d,90h

dad d

shld 187h

lhld 17fh

mov a,l

call perevid

xchg

shld 189h

lhld 181h

mov a,l

call perevid

xchg

shld 18bh

jmp exit

dopov: mvi a,100

sub l

call perevid

mvi a,9

sub h

mov d,a

ret

PEREVID: MVI d,-1

L100: INR d

SUI 100

JNC L100

ADI 100

MVI e,-1

L10: INR e

SUI 10

JNC L10

ADI 10

MOV C,A

MOV A,e

RRC

RRC

RRC

RRC

ORA C

MOV e,A

RET

exit:hlt

ORG 100H

LXI H,0212h

SHLD 17bh

LXI H,003ech

SHLD 17dh

LXI H,0015h

SHLD 17fh

LXI H,0062h

SHLD 181h

LXI H,0218h

SHLD 183h

LXI H,0686h

SHLD 185h

LXI H,9686h

SHLD 187h

LXI H,0021h

SHLD 189h

LXI H,0098h

SHLD 18Bh

LHLD 183h

XCHG

LHLD 187h

DAD D

SHLD 18dh

CALL DOPOV

SHLD 193h

XCHG

LHLD 189h

DAD D

SHLD 18fh

CALL DOPOV

SHLD 195h

XCHG

LHLD 18Bh

DAD D

SHLD 191h

CALL DOPOV

SHLD 197h

MOV A,L

JMP EXIT

DOPOV: ORI 0

MOV A,L

DAA

MOV L,A

MOV A,H

JNC COR

INR A

COR: ORI 0

DAA

MOV H,A

RET

EXIT: nop

HLT

7. Prn файли з коментарями

lab61.PRN:

0100 ORG 100H ; початок програми

0100 318301 LXI SP,183H; вершина стеку

0103 2E62 MVI L,98 ; заносимо в регістр 98

0105 E5 PUSH H ; заносимо в стек

0106 2E15 MVI L,21; заносимо в регістр 21

0108 E5 PUSH H; заносимо в стек

0109 2603 MVI H,3; в регістр h 3

010B 2E0E MVI L,14; в регістр l 14

010D E5 PUSH H; заносимо в стек

010E 2600 MVI H,0 ; заносимо 0

0110 2EDA MVI L,218 ; заносимо 218

0112 E5 PUSH H; заносимо в стек

0113 7D MOV A,L; заносимо l в а

0114 CD5201 CALL PEREVID процедура переводу в BCD

0117 EB XCHG; поміняти регістрові пари hl de

0118 228301 SHLD 183H; вивести в память

011B 2A7D01 LHLD 17DH; зситати з памяті

011E CD4701 CALL DOPOV ; процедура доповнення відємного числа

0121 62 MOV H,D; регістр d заноситься в h

0122 6B MOV L,E ; регістр е заноситься в l

0123 228501 SHLD 185H; запис в память

0126 1E00 MVI E,0; в рег е записуємо 0

0128 1690 MVI D,90H ; в рег d записуємо 90

012A 19 DAD D ; до hl додаємо de

012B 228701 SHLD 187H; вивід в память

012E 2A7F01 LHLD 17FH; зчитуємо з памяті

0131 7D MOV A,L; заносимо в а l

0132 CD5201 CALL PEREVID процедура переводу

0135 EB XCHG; міняємо вміст регістрів

0136 228901 SHLD 189H; вивід в память

0139 2A8101 LHLD 181H; зчитуємо з комірки памяті

013C 7D MOV A,L; заносимо в рег а l

013D CD5201 CALL PEREVID; процедура переводу в BCD

0140 EB XCHG; міняємо вміст регістрів

0141 228B01 SHLD 18BH

0144 C36F01 JMP EXIT; іти на вихід

0147 3E64 DOPOV: MVI A,100; процедура доповнення

0149 95 SUB L ; відняти від а рег l

014A CD5201 CALL PEREVID процедура переводу

014D 3E09 MVI A,9

014F 94 SUB H

0150 57 MOV D,A

0151 C9 RET вихід

0152 16FF PEREVID: MVI D,-1

0154 14 L100: INR D

0155 D664 SUI 100

0157 D25401 JNC L100

015A C664 ADI 100

015C 1EFF MVI E,-1

015E 1C L10: INR E

015F D60A SUI 10

0161 D25E01 JNC L10

0164 C60A ADI 10

0166 4F MOV C,A

0167 7B MOV A,E

0168 0F RRC ; зсуваємо циклічно вправо

0169 0F RRC

016A 0F RRC

016B 0F RRC

016C B1 ORA C ; логічне додавання

016D 5F MOV E,A

016E C9 RET

016F 76 EXIT:HLT; кінець

lab62.PRN:

0100 ORG 100H; початок програми

0100 211202 LXI H,0212H ; записуємо в регістр h 0212

0103 227B01 SHLD 17BH; виводимо в память

0106 21EC03 LXI H,003ECH записуємо в регістр h003е

0109 227D01 SHLD 17DH

010C 211500 LXI H,0015H записуємо в регістр h 0015

010F 227F01 SHLD 17FH

0112 216200 LXI H,0062H записуємо в регістр h 0062

0115 228101 SHLD 181H

0118 211802 LXI H,0218H записуємо в регістр h 0218

011B 228301 SHLD 183H

011E 218606 LXI H,0686H записуємо в регістр h 0686

0121 228501 SHLD 185H

0124 218696 LXI H,9686H записуємо в регістр h 9686

0127 228701 SHLD 187H

012A 212100 LXI H,0021H записуємо в регістр h 0021

012D 228901 SHLD 189H

0130 219800 LXI H,0098H записуємо в регістр h 0098

0133 228B01 SHLD 18BH

0136 2A8301 LHLD 183H; зчитуємо з комірки памяті

0139 EB XCHG

013A 2A8701 LHLD 187H

013D 19 DAD D

013E 228D01 SHLD 18DH; вивід в память

0141 CD6701 CALL DOPOV

0144 229301 SHLD 193H

0147 EB XCHG ; міняємо вмістиме регістрів

0148 2A8901 LHLD 189H

014B 19 DAD D

014C 228F01 SHLD 18FH

014F CD6701 CALL DOPOV ; процедура доповнення

0152 229501 SHLD 195H

0155 EB XCHG

0156 2A8B01 LHLD 18BH

0159 19 DAD D

015A 229101 SHLD 191H

015D CD6701 CALL DOPOV ; процедура доповнення

0160 229701 SHLD 197H

0163 7D MOV A,L

0164 C37601 JMP EXIT іти на вихід

0167 F600 DOPOV: ORI 0 ; початок процедурр доповнення

0169 7D MOV A,L

016A 27 DAA

016B 6F MOV L,A

016C 7C MOV A,H

016D D27101 JNC COR

0170 3C INR A

0171 F600 COR: ORI 0

0173 27 DAA

0174 67 MOV H,A

0175 C9 RET

0176 00 EXIT: NOP

0177 76 HLT ; остання команда

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]