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

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

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

Кафедра САПР

ЗВІТ

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

на тему:

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

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

Виконав:

ст. гр. КН - 36

Безпалько Є.В.

Прийняв:

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

ЛЬВІВ – 2011

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

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

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

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

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

Варіант № 96

Виконати операції над двійково-десятковими числами: 793-524+80-120. Результат записати в регістрову пару Н в 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) 793– 524 + 80 -120 = 229

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

(-524)доп = ( ( 1000– 1 ) – 524 ) + 1 =476

793 0000 0111 1001 0011

- 524 (476) 1001 0100 0111 0110

1001 1100 0000 1001

0110

1001 1100 0110 1001

0110

1010 0010 0110 1001

0110

269 0000 0010 0110 1001

2) 269 + 80 = 349

269 0000 0010 0110 1001

+ 80 0000 0000 1000 0000

0000 0010 1110 1001

0110

349 0000 0011 0100 1001

3) 349-120=229

349 0000 0011 0100 1001

+ (-120)880 1001 1000 1000 0000

1001 1011 1100 1001

0110

1001 1100 0010 1001

0110

1010 0010 0010 1001

0110

229 0000 0010 0010 1001

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

org 100h

mvi h,1

mvi l,20

shld 200h

mvi l,80

shld 202h

mvi h,5

mvi l,24

shld 204h

mvi h,7

mvi l,93

shld 206h

lhld 206h

mov a,l

call perevid

xchg

shld 208h

lhld 206h

mov a,h

call perevid

xchg

shld 209h

lhld 204h

call dopov

mov h,d

mov l,e

shld 20Ah

mvi e,0

mvi d,90h

dad d

shld 20Ch

lhld 202h

mov a,l

call perevid

xchg

shld 20Eh

lhld 200h

call dopov

mov h,d

mov l,e

shld 210h

mvi e,0

mvi d,90h

dad d

shld 212h

LHLD 208h

XCHG

LHLD 20Ch

mov a,d

adc h

mov h,a

mov a,e

adc l

mov l,a

SHLD 214h

CALL DOPOV1

SHLD 216h

XCHG

LHLD 20Eh

cmc

mov a,e

adc l

mov l,a

mov a,d

adc h

mov h,a

SHLD 218h

CALL DOPOV1

SHLD 21Ah

XCHG

LHLD 212h

mov a,e

adc l

mov l,a

mov a,d

adc h

mov h,a

SHLD 21Ch

CALL DOPOV1

SHLD 21Eh

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

DOPOV1:

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 файли з коментарями

0100 ORG 100H

0100 2601 MVI H,1

0102 2E14 MVI L,20

0104 220002 SHLD 200H ;заносим в пам'ять через регістрову пару HL

0107 2E50 MVI L,80

0109 220202 SHLD 202H

010C 2605 MVI H,5

010E 2E18 MVI L,24

0110 220402 SHLD 204H

0113 2607 MVI H,7

0115 2E5D MVI L,93

0117 220602 SHLD 206H

011A 2A0602 LHLD 206H

011D 7D MOV A,L

011E CD3302 CALL PEREVID ; переводим в BCD форму

0121 EB XCHG

0122 220802 SHLD 208H

0125 2A0602 LHLD 206H

0128 7C MOV A,H

0129 CD3302 CALL PEREVID

012C EB XCHG

012D 220902 SHLD 209H

0130 2A0402 LHLD 204H

0133 CD2802 CALL DOPOV ; переводим в доповнюючий код

0136 62 MOV H,D

0137 6B MOV L,E

0138 220A02 SHLD 20AH

013B 1E00 MVI E,0

013D 1690 MVI D,90H

013F 19 DAD D

0140 220C02 SHLD 20CH

0143 2A0202 LHLD 202H

0146 7D MOV A,L

0147 CD3302 CALL PEREVID

014A EB XCHG

014B 220E02 SHLD 20EH

014E 2A0002 LHLD 200H

0151 CD2802 CALL DOPOV

0154 62 MOV H,D

0155 6B MOV L,E

0156 221002 SHLD 210H

0159 1E00 MVI E,0

015B 1690 MVI D,90H

015D 19 DAD D

015E 221202 SHLD 212H

0161 2A0802 LHLD 208H

0164 EB XCHG

0165 2A0C02 LHLD 20CH

0168 7A MOV A,D

0169 8C ADC H ; виконуєм додавання BCD чисел

016A 67 MOV H,A

016B 7B MOV A,E

016C 8D ADC L

016D 6F MOV L,A

016E 221402 SHLD 214H

0171 CD5002 CALL DOPOV1

0174 221602 SHLD 216H

0177 EB XCHG

0178 2A0E02 LHLD 20EH

017B 3F CMC

017C 7B MOV A,E

017D 8D ADC L

017E 6F MOV L,A

017F 7A MOV A,D

0180 8C ADC H

0181 67 MOV H,A

0182 221802 SHLD 218H

0185 CD5002 CALL DOPOV1

0188 221A02 SHLD 21AH

018B EB XCHG

018C 2A1202 LHLD 212H

018F 7B MOV A,E

0190 8D ADC L

0191 6F MOV L,A

0192 7A MOV A,D

0193 8C ADC H

0194 67 MOV H,A

0195 221C02 SHLD 21CH

0198 CD5002 CALL DOPOV1

019B 221E02 SHLD 21EH

019E C3D601 JMP EXIT

P01A1 3E64 DOPOV: MVI A,100 ; функція доповнення

01A3 95 SUB L

01A4 CD3302 CALL PEREVID

01A7 3E09 MVI A,9

01A9 94 SUB H

01AA 57 MOV D,A

01AB C9 RET

P01AC 16FF PEREVID: MVI D,-1 ; перевід в BCD форму

P01AE 14 L100: INR D

01AF D664 SUI 100

01B1 D23502 JNC L100

01B4 C664 ADI 100

01B6 1EFF MVI E,-1

P01B8 1C L10: INR E

01B9 D60A SUI 10

01BB D23F02 JNC L10

01BE C60A ADI 10

01C0 4F MOV C,A

01C1 7B MOV A,E

01C2 0F RRC

01C3 0F RRC

01C4 0F RRC

01C5 0F RRC

01C6 B1 ORA C

01C7 5F MOV E,A

01C8 C9 RET

DOPOV1: ; доповнення BCD чисел

01C9 7D MOV A,L

01CA 27 DAA

01CB 6F MOV L,A

01CC 7C MOV A,H

01CD D25802 JNC COR

01D0 3C INR A

P01D1 F600 COR: ORI 0

01D3 27 DAA

01D4 67 MOV H,A

01D5 C9 RET

01D6 00 EXIT:NOP

01D7 76 HLT

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