МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
Звіт про виконання лабораторної роботи №6
на тему: “АЛГОРИТМИ ВИКОНАННЯ ОПЕРАЦІЙ ДОДАВАННЯ ТА ВІДНІМАННЯ ДВІЙКОВО\КОДОВАНИХ ДЕСЯТКОВИХ ЧИСЕЛ
ДЛЯ ОДНОКРИСТАЛЬНОГО МП 8080 (КР580ВМ80А) ”
з курсу: “ Комп’ютери та мікропроцесорні системи ”
Виконав
студент групи КН-3
Львів - 2006
1. МЕТА РОБОТИ
Вивчити алгоритми виконання операцій додавання та віднімання двійково\кодованих десяткоаих чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А), набути практичних навиків складання та налагоджування програм з використанням цих алгоритмів.
2. КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Існують протиріччя між машинним представленням чисел (двійкова система числення) і представлення чисел у повсякденному житті (десяткові числа). Перетворення між ними у випадку великого об'єму вхідних даних і вихідних результатів веде до помітних витрат комп'ютерного часу. Тому, розроблені форми представлення чисел, в яких суміщаються двійкова і десяткова системи числення. Такі форми отримали загальну назву двійково-кодованого десяткового представлення (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 коду в семисегментний на рідкокристалічний індикатор.
2.1 Арифметична операція додавання чисел в 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.
2.2 Арифметична операція віднімання чисел в BCD кодах
Використання набору арифметико-логічних команд МП КР580ВМ80А
використовується для виконання арифметичної операції віднімання двійково-кодованих десяткових чисел. Слід зауважити, для віднімання спеціальної команди корекції нема, тобто команда DAA не корегує результат двійкового віднімання. Тому операцію віднімання (X-Y) BCD-чисел необхідно виконувати в два етапи (операції виконуються в двійковому коді):
-утворити доповнюючий BCD-код від'ємника Y за формулою :
Yдоп = ((10k-1)-Y)+1), (1)
k-порядок BCD-чисел;
-додати отриманий двійково-десятковий код до зменшуваного : ( X+Yдоп ) ;
-скоригувати проміжний результат командою DAA.
Наприклад, для отримання доповнюючого десяткового коду дворозрядного BCD числа можна використати послідовність команд відповідно наведеної формули:
STC ; встановлення прапорця CY=1
MVI A,99h ; запис в акумулятор числа 99h
ACI 0 ; отримуєм еквівалент 100 в коді BCD
SUB M ; отримуєм доповнюючий BCD-код.
Так, для Y=63, в результаті виконання наведеної послідовності доповнюючий код буде Yдоп=(100-63)=37, а в BCD форматі 0011 0111.
2.3 Арифметична операція додавання/віднімання знакових чисел
в 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
2.4 Перетворення чисел двійково-десяткового формату
в двійковий формат і з двійкового формату в 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
Постановка лабораторного завдання
Використовуючи акумулятор, ввести дані 89, 71, 65, 58 в пам’ять. Виконати над ними дії: (1-2)+(3-4). Дані представлені у двійково-десятковому форматі.
Текст програми
ORG 100H
LXI H,800H
MVI A,89
MOV M,A
INX H
MVI A,71
MOV M,A
INX H
MVI A,65
MOV M,A
INX H
MVI A,58
MOV M,A
LDA 800H
MOV B,A
MVI A,100
LXI H,801H
SUB M
ADD B
DAA
MOV D,A
LDA 802H
MOV B,A
MVI A,100
LXI H,803H
SUB M
ADD B
DAA
ADD D
DAA
HLT
Результати виконання програми
EMBED PBrush
Висновки: виконавши дану лабораторну роботу, я вивчив операції додавання та віднімання чисел у двійково-десятковому форматі.