МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
 Національній університет "Львівська політехніка" 
Звіт 
до лабораторної роботи №6
АЛГОРИТМИ ВИКОНАННЯ ОПЕРАЦІЙ ДОДАВАННЯ ТА ВІДНІМАННЯ ДВІЙКОВО\КОДОВАНИХ ДЕСЯТКОВИХ 
ЧИСЕЛ ДЛЯ ОДНОКРИСТАЛЬНОГО
 МП  8080 (КР580ВМ80А)
Виконала
Ст.гр.КН-3
ЛЬВІВ 2006
 	МЕТА РОБОТИ:  Вивчити алгоритми виконання операцій додавання та віднімання двійково- десяткових чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А), набути практичних навиків складання та налагоджування програм з використанням цих алгоритмів.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
        Існують протиріччя між машинним представленням чисел (двійкова система числення) і представлення чисел у повсякденному житті (десяткові числа). Перетворення між ними у випадку великого об'єму вхідних даних і вихідних результатів веде до помітних витрат комп'ютерного часу. Тому, розроблені форми представлення чисел, в яких суміщаються двійкова і десяткова системи числення. Такі форми отримали загальну назву двійково-кодованого десяткового представлення (Binari-Coded Decimal) або BCD-кодування. У спакованому форматі, який часто називають BCD-представленням десяткових чисел, байт містить дві десяткові цифри. Молодша цифра займає праву тетраду (біти 3:0), старша - ліву тетраду (біти 7:4).	Набір команд арифметичних операцій чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А) містить спеціальну команду двійково-десяткової корекції акумулятора DAA (Decimal Adjust Accumulator). 
Арифметична операція додавання чисел в 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) в даній тетраді та одиницю переносу в наступну тетраду. Наприклад, проміжний результат двійкового додавання BCD-чисел  79 і 39 має такий вигляд:  
                                                           0111 1001
                                                        + 0011 1001 
                                                           1011  0010 (CY=1, AC=1)
Після виконання команди  DAA :  0001 1000  (CY=1), отримали результат 118.
Арифметична операція віднімання чисел в BCD кодах
Для отримання доповнюючого десяткового коду дворозрядного BCD числа можна використати послідовність команд відповідно наведеної формули:
                   STC               ; встановлення прапорця CY=1           
                   MVI A,99h     ; запис в акумулятор числа 99h                                          
                   ACI 0              ; отримуєм еквівалент 100 в коді BCD                                           
                   SUB M            ; отримуєм доповнюючий BCD-код.
Так, для Y=63, в результаті виконання наведеної послідовності доповнюючий код буде Yдоп=(100-63)=37, а в BCD форматі 0011 0111.
Арифметична операція додавання/віднімання знакових чисел в BCD кодах
Алгоритм додавання/віднімання BCD чисел зі знаком повинен обов'язково враховувати знаки операндів. Під знак в двійково-десятковому кодуванні відводиться старша тетрада: знаку "+" відповідає код 0000, знаку "-" код 1001. Наприклад, 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-коди.
	Приклад програми перетворення 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
Індивідуальне завдання:
Виконати наступні операції над беззнаковими двійково-десятковими числами:
793-524+80-120. Числа виводити через регістрову пару DE, а результат з числами  в  ОР в регістрістрову пару HL в упакованому BCD форматі.
  ORG 100h
 LXI H,793h
 SHLD 300h
 LXI H,524h
 SHLD 302h
 LXI H,80h
 SHLD 304h
 LXI H,120h
 SHLD 306h
LDA 302h                  
MOV B,A
    mvi A,99h
    sub B
    stc
    aci 0
    mov E,A
LDA 303h
MOV B,A
    mvi A,9h
    sub B
    mov D,A
lda 300h                
	add E
	DAA
	mov E,A
lda 301h
	adc D
	DAA
	mov D,A
lda 304h               
	add E
	DAA
	mov E,A
lda 305h
	adc D
	DAA
	mov D,A
     LDA 306H           
     MOV B,A
       mvi A,99h
   	 sub B
       stc
       aci 0
   	 mov C,A
lda 307h
mov B,a
    mvi A,9h
    sub B
    mov B,A
 Mov a,c
 add e
 daa
 mov e,a
 mov a,b
 adc d
 daa
 mov d,a  
 HLT
Результати виконання програми:
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0000 S=0100 P=0100 LXI  H,0793
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0793 S=0100 P=0103 SHLD 0300
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0793 S=0100 P=0106 LXI  H,0524
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0524 S=0100 P=0109 SHLD 0302
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0524 S=0100 P=010C LXI  H,0080
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0080 S=0100 P=010F SHLD 0304
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0080 S=0100 P=0112 LXI  H,0120
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0120 S=0100 P=0115 SHLD 0306
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0120 S=0100 P=0118 LDA  0302
C0Z0M0E0I0 A=24 B=0000 D=0000 H=0120 S=0100 P=011B MOV  B,A
C0Z0M0E0I0 A=24 B=2400 D=0000 H=0120 S=0100 P=011C MVI  A,99
C0Z0M0E0I0 A=99 B=2400 D=0000 H=0120 S=0100 P=011E SUB  B
C0Z0M0E0I0 A=75 B=2400 D=0000 H=0120 S=0100 P=011F STC
C1Z0M0E0I0 A=75 B=2400 D=0000 H=0120 S=0100 P=0120 ACI  00
C0Z0M0E0I0 A=76 B=2400 D=0000 H=0120 S=0100 P=0122 MOV  E,A
C0Z0M0E0I0 A=76 B=2400 D=0076 H=0120 S=0100 P=0123 LDA  0303
C0Z0M0E0I0 A=05 B=2400 D=0076 H=0120 S=0100 P=0126 MOV  B,A
C0Z0M0E0I0 A=05 B=0500 D=0076 H=0120 S=0100 P=0127 MVI  A,09
C0Z0M0E0I0 A=09 B=0500 D=0076 H=0120 S=0100 P=0129 SUB  B
C0Z0M0E0I0 A=04 B=0500 D=0076 H=0120 S=0100 P=012A MOV  D,A
C0Z0M0E0I0 A=04 B=0500 D=0476 H=0120 S=0100 P=012B LDA  0300
C0Z0M0E0I0 A=93 B=0500 D=0476 H=0120 S=0100 P=012E ADD  E
C1Z0M0E1I0 A=09 B=0500 D=0476 H=0120 S=0100 P=012F DAA
C1Z0M0E1I0 A=69 B=0500 D=0476 H=0120 S=0100 P=0130 MOV  E,A
C1Z0M0E1I0 A=69 B=0500 D=0469 H=0120 S=0100 P=0131 LDA  0301
C1Z0M0E1I0 A=07 B=0500 D=0469 H=0120 S=0100 P=0134 ADC  D
C0Z0M0E1I0 A=0C B=0500 D=0469 H=0120 S=0100 P=0135 DAA
C0Z0M0E1I1 A=12 B=0500 D=0469 H=0120 S=0100 P=0136 MOV  D,A
C0Z0M0E1I1 A=12 B=0500 D=1269 H=0120 S=0100 P=0137 LDA  0304
C0Z0M0E1I1 A=80 B=0500 D=1269 H=0120 S=0100 P=013A ADD  E
C0Z0M1E0I0 A=E9 B=0500 D=1269 H=0120 S=0100 P=013B DAA
C1Z0M0E0I0 A=49 B=0500 D=1269 H=0120 S=0100 P=013C MOV  E,A*013D
C1Z0M0E0I0 A=49 B=0500 D=1249 H=0120 S=0100 P=013D LDA  0305
C1Z0M0E0I0 A=00 B=0500 D=1249 H=0120 S=0100 P=0140 ADC  D
C0Z0M0E0I0 A=13 B=0500 D=1249 H=0120 S=0100 P=0141 DAA
C0Z0M0E0I0 A=13 B=0500 D=1249 H=0120 S=0100 P=0142 MOV  D,A
C0Z0M0E0I0 A=13 B=0500 D=1349 H=0120 S=0100 P=0143 LDA  0306
C0Z0M0E0I0 A=20 B=0500 D=1349 H=0120 S=0100 P=0146 MOV  B,A
C0Z0M0E0I0 A=20 B=2000 D=1349 H=0120 S=0100 P=0147 MVI  A,99
C0Z0M0E0I0 A=99 B=2000 D=1349 H=0120 S=0100 P=0149 SUB  B
C0Z0M0E0I0 A=79 B=2000 D=1349 H=0120 S=0100 P=014A STC
C1Z0M0E0I0 A=79 B=2000 D=1349 H=0120 S=0100 P=014B ACI  00
C0Z0M0E0I0 A=7A B=2000 D=1349 H=0120 S=0100 P=014D MOV  C,A
C0Z0M0E0I0 A=7A B=207A D=1349 H=0120 S=0100 P=014E LDA  0307
C0Z0M0E0I0 A=01 B=207A D=1349 H=0120 S=0100 P=0151 MOV  B,A
C0Z0M0E0I0 A=01 B=017A D=1349 H=0120 S=0100 P=0152 MVI  A,09
C0Z0M0E0I0 A=09 B=017A D=1349 H=0120 S=0100 P=0154 SUB  B
C0Z0M0E0I0 A=08 B=017A D=1349 H=0120 S=0100 P=0155 MOV  B,A
C0Z0M0E0I0 A=08 B=087A D=1349 H=0120 S=0100 P=0156 MOV  A,C
C0Z0M0E0I0 A=7A B=087A D=1349 H=0120 S=0100 P=0157 ADD  E
C0Z0M1E1I1 A=C3 B=087A D=1349 H=0120 S=0100 P=0158 DAA
C1Z0M0E0I1 A=29 B=087A D=1349 H=0120 S=0100 P=0159 MOV  E,A
C1Z0M0E0I1 A=29 B=087A D=1329 H=0120 S=0100 P=015A MOV  A,B
C1Z0M0E0I1 A=08 B=087A D=1329 H=0120 S=0100 P=015B ADC  D
C0Z0M0E0I0 A=1C B=087A D=1329 H=0120 S=0100 P=015C DAA
C0Z0M0E1I1 A=22 B=087A D=1329 H=0120 S=0100 P=015D ANI  0F
C0Z0M0E0I1 A=02 B=087A D=1329 H=0120 S=0100 P=015F MOV  D,A
C0Z0M0E0I1 A=02 B=087A D=0229 H=0120 S=0100 P=0160 HLT
PRN-код:
 0100           ORG 100H
 0100 219307     LXI H,793H          ;заносимо числа в память 300Н-307Н
 0103 220003     SHLD 300H
 0106 212405     LXI H,524H
 0109 220203     SHLD 302H
 010C 218000     LXI H,80H
 010F 220403     SHLD 304H
 0112 212001     LXI H,120H
 0115 220603     SHLD 306H
 0118 3A0203    LDA 302H                  ; шукаємо доповнюючий код до  числа 524
 011B 47        MOV B,A
 011C 3E99          MVI A,99H
 011E 90            SUB B
 011F 37            STC
 0120 CE00          ACI 0
 0122 5F            MOV E,A
 0123 3A0303    LDA 303H
 0126 47        MOV B,A
 0127 3E09          MVI A,9H
 0129 90            SUB B
 012A 57            MOV D,A
 012B 3A0003    LDA 300H                 ;завантажуємо 793 і додаємо доповнюючий 
 012E 83        	ADD E                    ;числа 524
 012F 27        	DAA
 0130 5F        	MOV E,A
 0131 3A0103    LDA 301H
 0134 8A        	ADC D
 0135 27        	DAA
 0136 57        	MOV D,A
 0137 3A0403    LDA 304H                ; до результату додаємо число 80
 013A 83        	ADD E
 013B 27        	DAA
 013C 5F        	MOV E,A
 013D 3A0503    LDA 305H
 0140 8A        	ADC D
 0141 27        	DAA
 0142 57        	MOV D,A
 0143 3A0603         LDA 306H           ;знаходимо доповнюючий код до числа 120
 0146 47             MOV B,A
 0147 3E99             MVI A,99H
 0149 90           	 SUB B
 014A 37               STC
 014B CE00             ACI 0
 014D 4F           	 MOV C,A
 014E 3A0703    LDA 307H
 0151 47        MOV B,A
 0152 3E09          MVI A,9H
 0154 90            SUB B
 0155 47            MOV B,A
 0156 79         MOV A,C
 0157 83         ADD E                         ;додаємо до результату доповнюючий код 
 0158 27         DAA                             ;числа 120
 0159 5F         MOV E,A
 015A 78         MOV A,B
 015B 8A         ADC D
 015C 27         DAA
 015D E60F       ANI 00001111B
 015F 57         MOV D,A  
 0160 76         HLT
                
                
Карта пам’яті
  Висновок: на даній  лабораторній роботі я  вивчила алгоритми виконання операцій додавання та віднімання двійково-десяткових чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А), набути практичних навиків складання та налагоджування програм з використанням цих алгоритмів