МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет Львівська політехніка
Кафедра САПР
Звіт
До лабораторної роботи №6
З курсу “Архітектура комп’ютерів”
На тему:
«Вивчити алгоритми виконання операцій додавання та віднімання двійково-кодованих десяткових чисел для однокристального МП КР580».
Мета: Вивчити алгоритми виконання операцій додавання та віднімання двійково/кодованих десяткових чисел для однокристального мікропроцесора (МП) КР580, набути практичних навиків складання та налагоджування програм з використанням цих алгоритмів.
Короткі теоретичні відомості
Існують протиріччя між машинним представленням чисел (двійкова система числення ) і представленням чисел у повсякденному житті (десяткові числа). Перетворення між ними у випадку великого об'єму вхідних даних і вихідних результатів веде до помітних витрат процесорного часу. Тому, розроблені такі форми представлення чисел, в яких суміщаються двійкова і десяткова системи числення. Такі форми отримали загальну назву двійково-кодованого десяткового представлення (Binari-Coded Decimal) або BCD-кодування. У спакованому форматі, який часто називають BCD-представленням десяткових чисел, байт містить дві десяткові цифри. Молодша цифра займає праву тетраду (біти 3:0), старша - ліву тетраду (біти 7:4). Обидві цифри представляються своїми двійковими еквівалентами, які називаються також кодом 8/4/2/1 (за вагами двійкових розрядів). Розміщення десяткових цифр у байті показано на рисунку
plpOpOplpOplplpOp
Додавання BCD-чисел виконуються у два етапи :
1.Операнди додаються як двійкові числа;
2. Виконується корекція неправильного (загалом) проміжного результату.
Корекцію виконує команда DAA - виконати десяткову корекцію акумулятора. За цією командою до акумулятора підєднується схема десяткової корекції, яка 8-розрядний код, що знаходиться в акумуляторі, інтерпретує як пару десяткових двійково-кодованих символів і виконує такі операції :
- якщо молодша тетрада містить число, яке більше ніж 9, або якщо встановлений прапорець переносу АС=1, то вміст акумулятора збільшується на 6;
- якщо після цього старша тетрада містить число, яке більше ніж 9, або якщо встановлено прапорець CY=1, то до старшої тетрадп додається 6.
Наприклад, проміжний результат двійкового додавання BCD-чисел 79 і 39 має такий вигляд : 1О11 OO1O (CY=0, АС=1), а після виконання команди DAA отримаємо О111 О11О ( CY=l ), тобто правильний результат 118. Необхідно зауважити, що команда DAA не корегує результат двійкового віднімання. Тому, операцію віднімання BCD-чисел необхідно виконувати у два етапи: спершу утворюється доповнення від'ємника до 1О (тобто десятковий доповнюючий код), а потім отримане число додаться до зменшуваного. Після цього результат додавання можна корегувати командою DAA. Для отриманого десяткового доповнюючого коду може бути використана така послідовність команд :
STC
MVI A.99H
АСІ 0
SUB М
Перша команда встановлює прапорець CY=1. У результаті виконання третьої команди в акумуляторі буде число 9АН. Це еквівалент числа 100 в десятковій системі у коді BCD, тобто 99+1. У результаті виконання четвертої команди в акумуляторі буде сформовано доповнюючий до 100 код двозначного десяткового числа . Далі можна виконати додавання отриманого числа до зменшуваного і використовувати команду DAA.
МП КР580 дозволяє виконувати арифметичні операції над двійковими і двійково-кодованими десятковими (BCD-формат) числами. Для ефективного використання множини арифметичних команд МП КР580 необхідні програмні засоби для переводу із формату BCD у двійковий формат і навпаки.
Розглянемо алгоритм і програму перетворення 8-6ітного двійкового цілого беззнакового числа в упаковане десяткове число. В упакованому десяткованому числі кожен байт містить по дві цифри у форматі BCD. Припустимо, що в акумуляторі А знаходиться байт, який інтерпретується як двійкове ціле беззнакове число (діапазон від 0 до 255), і необхідно утворити в парі регістрів HL його представлення як упакованого десяткового числа. Простий спосіб перетворення полягає в тому, щоб спочатку визначити цифру сотень шляхом віднімання 100 від вихідного числа. Потім знаходиться цифра десятків послідовним відніманням 10. Після цього в акумуляторі залишається цифра одиниць. Віднімання обидва рази виконується до отримання від'ємної різниці з підрахунком числа віднімань, а потім до від'ємної різниці додається 100 (або 10) для відновлення останньої додатної різниці, яка менша ніж 100 (або 10).
Програма перетворення 8-бітного цілого беззнакового числа в упаковане десяткове число виглядає так:
BBCD: MVI Н,-1 L100: INR Н
SUI 100
JNC L100
ADI 100
MVI L.-1L10: INR L
SUI 10
JNC L10
ADI 10
MOV С,А
MOV A,L
RRC
RRC
RRC
RRC
ORA C
MOV L,A
HLT
Розглянемо алгоритм і програму перетворення упакованого десяткового цілого беззнакового числа у двійкове. Нехай в акумуляторі А знаходиться байт, який представляє собою упаковане десяткове ціле беззнакове число (діапазон від 0 до 99), і необхідно утворити в акумуляторі еквівалентне двійкове число.
Перетворення полягає в тому, щоб старшу тетраду акумулятора (тобто цифру десятків) домножити на 10 і додати до отриманого добутку молодшу тетраду (цифру одиниць). Найпростіше множення на 10 (в двійковому коді 1010В) виконується шляхом множення цифри на 8 (зсунути на три біти вліво) і додавання цифри, домноженої на 2 (зсув на один біт вліво). Оскільки цифра десятків знаходиться у старшій тетраді, то замість зсуву її з молодшої тетрадп вліво, здійснюється зсув вправо.
Завдання
Виконати арифметичні операції над двійково-десятковими числами: знакові (-9)+5+(-3)+7. Дані вводяться через регістрову пару. Результат записати в регістр С в двійковій системі.