
Міністерство Освіти І НАУКИ України
Національний університет "Львівська політехніка"
Кафедра САПР
ЗВІТ
для лабораторної роботи №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