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