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