Арифметичні операції з BCD числами

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

По курсу: "Системне програмування та обчислювальні системи"
На тему: "Арифметичні операції з BCD числами"

Зміст:
1. Двійково-десятковому форматі (BCD) ... ... ... ... ... ... ... ... .... 3
2. Арифметичні інструкції ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 4
2.1. Формати арифметичних даних ... ... ... ... ... ... ... ... ... ... ... ... ... .. 4
2.2. Арифметичні операції і прапори ... ... ... ... ... ... ... ... ... ... ... ... ... 5
2.3. Додавання ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 6
2.4. Віднімання ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 7
2.5. Множення ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... 8
2.6. Розподіл ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 9
3. ЛІТЕРАТУРА ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... 12

1. Двійково-десятковому форматі (BCD)
Нехай в деякому прикладі поділу в ASCII-форматі було отримано приватне 00090204. Якщо стиснути це значення, зберігаючи лише праві цифри кожного байта, то отримаємо 0924. Такий формат називається двійково-десятковим (BCD - Binary Coded Decimal) (або упакованим). Він містить лише десяткові цифри від 0 до 9. Довжина двійково-десяткового подання в два рази менше ASCII-вистави.
Зауважимо, однак, що десяткове число 0924 має підставу 10 і, будучи перетвореним в основу 16 (тобто в жердину. Подання), дасть шест.039C.
ПЕРЕТВОРЕННЯ ASCII-ФОРМАТУ у двійковому форматі
Виконання арифметичних операцій над числами у ASCII або BCD форматах зручно лише для коротких полів. У більшості випадків для арифметичних операцій використовується перетворення в двійковий формат. Практично простіше перетворення з ASCII-формату безпосередньо в двійковий формат, ніж перетворення з ASCII-в BCD-формат і, потім, в двійковий формат:
Метод перетворення базується на тому, що ASCII-формат має підставу 10, а комп'ютер виконує арифметичні операції тільки над числами з основою 2. Процедура перетворення полягає в наступному:
1. Починають з самого правого байта числа в ASCII-форматі і обробляють справа наліво.
2. Видаляють трійки з лівих жердину. цифр кожного ASCII-байта.
3. Множать ASCII-цифри на 1, 10, 100 (шест.1, A, 64) і т.д. і складають результати.
Для прикладу розглянемо перетворення числа 1234 з ASCII-формату в двійковий формат:
Десяткове Шістнадцяткове
H
4 х 1 = 4 квітня
3 х 10 = 30 1E
2 х 100 = 200 C8
1 х 1000 = 1000 - 3E8 -
Результат: 04D2
З цього прикладу видно, що шістнадцяткове число .04 D2 дійсно відповідає десятковому 1234.

2. Арифметичні інструкції.

2.1. Формати арифметичних даних.

Арифметичні операції процесорів 8086/8088 можуть виконуватися над операндами 4-х типів (таблиця 2.1):
1. Двійкові без знака.
2. Двійкові зі знаком (цілі).
3. Запаковані десяткові без знака.
4. Розпаковані десяткові без знака.
Таблиця 2.1. Арифметична інтерпретація 8-бітових чисел.
16-річне
бітове
дв. без
знака
дв. з
знаком
розпакуйте.
десяткового.
упак.
десят.
07
89
C5
00000111
10001001
11000101
7
137
197
+7
-119
-59
7
некорр.
некорр.
7
89
некори.
Двійкові числа можуть займати 1 або 2 байти. Десяткові числа зберігаються побайтно по 2 десяткової цифри на байт для упакованого формату або по 1 десяткової цифри на байт для розпакованого формату. Процесор припускає, що визначені в арифметичних інструкціях операнди містять дані, що представляють коректні для даної інструкції числа. Некоректні дані можуть привести до непередбачуваних результатів.
Двійкові числа без знака можуть займати 8 або 16 біт; всі біти значущі. Діапазон значень 8-бітового числа - від 0 до 255, 16-бітового - від 0 до 65535. Над двійковими числами без знаку можна виконувати операції додавання, віднімання, множення і ділення.
Двійкові числа зі знаком (цілі) можуть займати також 8 або 16 біт. Значення старшого біта (самого лівого) задає знак числа: 0 - позитивне, 1 - негативне. Негативні числа представляються стандартним доповненням до 2. Оскільки один розряд відведено під знак, діапазон зміни 8-бітового числа - від -127 до +127, 16-бітового-від -32768 до +32767. Кількість 0 має позитивний знак. Над двійковими числами із знаком можуть бути виконані операції множення і ділення. Додавання і віднімання виконуються без урахування знака. Для виявлення переносу в знаковий розряд в результаті беззнаковое операції можна використовувати інструкції умовного переходу.
Запаковані десяткові числа зберігаються як беззнакові байтові величини. Кожен байт містить 2 десяткові цифри, що займають по 4 біта кожна. Цифра в старшому полубайте більш значуща. У кожному полубайте допустимі тільки 16-ковий значення від 0 до 9; відповідно межі зміни десяткового числа - від 0 до 99. Додавання і віднімання таких чисел виконуються в 2 стадії. Спочатку застосовується звичайна беззнакові двійкова інструкція, яка формує в регістрі AL проміжний результат. Потім виконується операція налаштування (інструкція DAA або DAS), перетворююча вміст AL в коректний упакований десятковий результат. Множення і ділення упакованих десяткових чисел неможливо.
Розпаковані десяткові числа зберігаються як беззнакові байтові величини. Десяткова цифра розташовується в молодшому полубайте. Припустимо й інтерпретуються як десяткові числа 16-ковий значення від 0 до 9. Для виконання операцій множення і ділення старший полубайта повинен бути заповнений нулями; для додавання і віднімання він може містити будь-яке значення. Арифметичні операції над розпакованими десятковими числами виконуються в 2 стадії. Спочатку використовуються звичайні беззнакові інструкції складання, віднімання або множення, які формують в регістрі AL проміжний результат. Потім виконується операція налаштування (інструкція AAA, AAS або AAM), перетворююча вміст AL в результуюче коректне розпаковане десяткове число. Розподіл виконується аналогічно, за винятком того, що спочатку слід налаштувати чисельник в AL (інструкція AAD), а потім виконати інструкцію беззнакового двійкового поділу, результатом якого буде коректне розпаковане десяткове число.
Формат десяткових розпакованих чисел подібний поданням десяткових цифр у коді ASCII. При цьому для числа в коді ASCII старший полубайта містить 16-річне значення 3. Можливе вміст старшого полубайта для розпакованого формату наведено вище. Перетворення з одного виду в інший складності не представляє.

2.2. Арифметичні операції і прапори.

Арифметичні інструкції процесорів 8086/8088 залишають після свого виконання деякі характеристики результатів операцій у вигляді значень 6 прапорів. Більшість з них можуть аналізуватися подальшими інструкціями умовного переходу; може також використовуватися інструкція переривання по переповнення INTO. Вплив кожної інструкції на прапори вказано при описі інструкції.
Проте є такі загальні правила:
1. Прапор переносу CF встановлюється в 1, якщо в результаті операції додавання було перенесення з старшого біта або в результаті операції віднімання був позику в старший біт результату. Якщо ж перенесення або позички не було, CF встановлюється в 0. Зауважимо, що знаковий перенесення характеризується різними значеннями прапорів CF і OF. Прапор CF може використовуватися для виявлення беззнакового переповнення. Слід пам'ятати, що 2 інструкції, ADC (додавання з переносом) і SBB (віднімання з заемом) втягують CF в свої операції і можуть бути тому використані для мультібайтного (32 -, 64-розрядного) додавання і віднімання.
2. Прапор проміжного перенесення AF встановлюється в 1 при перенесенні з молодшого полубайта результату під час складання або при позику в молодший полубайта результату під час віднімання. Якщо ж перенесення або позички не було, AF встановлюється в 0. Прапор AF введений для виконання десяткової налаштування і звичайно в інших цілях не використовується.
3. Прапор знака SF встановлюється арифметичними і логічними інструкціями рівним старшому (7-му чи 15-му) біту результату. Для двійкових чисел зі знаком SF буде дорівнює 0 у разі позитивного результату і 1 - у разі негативного (якщо немає переповнення). Значення прапора SF може аналізуватися після додавання або віднімання інструкціями умовного переходу. Програми, що виконують беззнакові операції, зазвичай ігнорують SF, тому що старший біт результату в цьому випадку інтерпретується як двійкова цифра, а не як знак.
4. Прапор нуля ZF встановлюється в 1, якщо результат арифметичної або логічної операції дорівнює 0, і встановлюється в 0, якщо результат відмінний від 0. Значення прапора може аналізуватися інструкціями умовного переходу.
5. Прапор паритету PF встановлюється в 1, якщо молодші 8 біт результату арифметичної або логічної операції містять парне число одиниць, і встановлюється в 0, якщо число одиниць непарній. Прапор PF введено для сумісності з процесорами 8080/8085, він може також використовуватися для контролю символів в коді ASCII на коректність паритету.
6. Прапор переповнення OF встановлюється в 1, якщо результат занадто великий для позитивного числа або занадто малий для негативного і не поміщається в операнд-приймач (не рахуючи знаковий розряд). В іншому випадку значення OF -0. Стан цього прапора відображає наявність арифметичного переповнення зі знаком. Він може аналізуватися інструкціями умовного переходу або інструкцією INTO. У беззнакових операціях OF зазвичай ігнорується.

2.3. Додавання.

ADD приймач, джерело ДОДАВАННЯ байтів або слів
Арифметична сума 2-х операндів, якими можуть бути байти або слова, заміщає операнд-приймач. Обидва операнда можуть містити двійкові числа із знаком або без нього (див. AAA і DAA). ADD модифікує прапори AF, CF, OF, PF, SF і ZF.
ADC приймач, джерело ДОДАВАННЯ З перенесенням
Ця інструкція виконує арифметичну суму своїх операндів, додає 1, якщо встановлено у 1 прапор CF, і поміщає результат на місце операнда-приймача. Обидва операнда можуть містити двійкові числа із знаком або без нього (див. AAA і DAA). ADC модифікує прапори AF, CF, OF, PF, SF і ZF. Оскільки ADC використовує перенесення від попередньої операції, вона може застосовуватися для складання чисел довшим 2 байтів.
INC приймач ЗБІЛЬШЕННЯ байт або слово НА 1
До вмісту приймача додається 1. Операнд може бути байтом або словом і розглядається як двійкове число без знака (див. AAA і DAA). INC модифікує прапори AF, OF, PF, SF і ZF і не впливає на CF.
AAA ASCII-НАСТРОЙКА ДЛЯ СКЛАДАННЯ
Ця інструкція перетворює вміст регістра AL у коректне розпаковане десяткове число; старший полубайта обнуляється. AAA модифікує прапори AF і CF; стану прапорів OF, PF, SF і ZF після AAA не визначені.
DAA ДЕСЯТКОВЕ НАСТРОЙКА ДЛЯ СКЛАДАННЯ
Ця інструкція коригує результат попереднього складання 2-х правильних упакованих десяткових чисел, який міститься в регістрі AL. Вміст AL перетворюється на пару коректних упакованих десяткових чисел. DAA модифікує прапори AF, CF, PF, SF і ZF; стан прапора OF після DAA не визначено.

2.4. Вирахування.

SUB приймач, джерело Віднімання байтів або слів
Вміст джерела віднімається з вмісту приймача, і результат поміщається на місце приймача. Операнди можуть бути байтами або словами і містити двійкові числа із знаком або без нього (див. AAS і DAS). SUB модифікує прапори AF, CF, OF, PF, SF і ZF.
SBB приймач, джерело віднімання з Позика
З цієї інструкції вміст джерела віднімається з вмісту приймача, з результату віднімається ще 1, якщо встановлено у 1 прапор CF, і остаточний результат міститься на місце приймача. Обидва операнда можуть бути байтами або словами і містити двійкові числа із знаком або без нього (див. AAS і DAS). SBB модифікує прапори AF, CF, OF, PF, SF і ZF. Оскільки SBB використовує позику попередньої операції, вона може застосовуватися для вирахування чисел довшим 2 байтів.
DEC приймач ЗМЕНШЕННЯ байт або слово НА 1
Вміст приймача зменшується на 1. Приймач може бути байтом або словом. DEC модифікує прапори AF, OF, PF, SF і ZF і не впливає на стан CF.
NEG приймач ОТРИЦАНИЕ байт або слово
З цієї інструкції вміст приймача, який може бути байтом або словом, віднімається від 0, і результат міститься на місце приймача. Ця форма доповнення до 2 використовується для зміни знака цілого числа. Якщо операнд дорівнює 0, його знак не змінюється. Спроба заперечення байта, що містить -128, або слова, що містить -32768, не змінює операнд, але встановлює в 1 прапор OF. NEG модифікує прапори AF, CF, OF, PF, SF і ZF. Прапор CF завжди встановлюється в 1, виключаючи той випадок, коли операнд дорівнює 0 (тоді і CF = 0).
CMP приймач, джерело ПОРІВНЯННЯ байтів або слів
Інструкція CMP віднімає вміст джерела з вмісту приймача, але результат не повертає. Операнди, які можуть бути байтами або словами, не змінюються, але модифікуються прапори AF, CF, OF, PF, SF і ZF, що може аналізуватися подальшими інструкціями умовного переходу. Стану цих прапорів відображають ставлення приймача до джерела. Наприклад, якщо після CMP слід інструкція JG, перехід відбудеться, якщо вміст приймача більше вмісту джерела.
AAS ASCII-НАСТРОЙКА для віднімання
Ця інструкція перетворює знаходиться в регістрі AL результат попередньої операції віднімання 2-х коректних десяткових розпакованих чисел у коректне десяткове розпаковане число, яке залишається також в AL. Старший полубайта регістра AL обнуляється. AAS модифікує прапори AF і CF; стану прапорів OF, PF і ZF після AAS не визначені.
DAS ДЕСЯТКОВЕ НАСТРОЙКА для віднімання
Ця інструкція перетворює знаходиться в регістрі AL результат попередньої операції віднімання 2-х коректних десяткових упакованих чисел в пару коректних десяткових упакованих цифр, що залишаються також в AL. DAS модифікує прапори AF, CF, PF, SF і ZF; стан прапора OF не визначено.

2.5. Множення.

MUL джерело множенні байтів АБО СЛІВ БЕЗ ЗНАКУ
Інструкція MUL виконує беззнаковое множення умістів джерела і акумулятора. Якщо джерело є байтом, як акумулятор використовується регістр AL, а результат подвійної довжини поміщається в регістри AH і AL. Якщо джерело є словом, як акумулятор використовується регістр AX, а результат подвійної довжини поміщається в регістри DX і AX. Операнди розглядаються як двійкові числа без знака (див. AAM). Якщо старша половина результату (вміст AH для джерела-байта або вміст DX для джерела-слова) не дорівнює 0, прапори CF і OF встановлюються в 1, в іншому випадку - в 0. Коли CF і OF встановлені в 1, це означає, що AH або DX містить значущі цифри результату. Стани прапорів AF, PF, SF і ZF після MUL не визначені.
IMUL джерело Цілочисельні множенні байтів АБО СЛІВ
Інструкція IMUL виконує множення зі знаком умістів джерела і акумулятора. Якщо джерело є байтом, як акумулятор використовується регістр AL, а результат подвійної довжини поміщається в регістри AH і AL. Якщо джерело є словом, як акумулятор використовується регістр AX, а результат подвійної довжини поміщається в регістри DX і AX. Якщо старша половина результату (вміст AH для джерела-байта або вміст DX для джерела-слова) не є розширенням знаку молодшої половини, прапори CF і OF встановлюються в 1, в іншому випадку - в 0. Коли CF і OF встановлені в 1, це означає, що AH або DX містить значущі цифри результату. Стани прапорів AF, PF, SF і ZF після IMUL не визначені.
AAM ASCII-НАСТРОЙКА на посилення
Інструкція AAM коригує результат попередньої операції множення 2-х коректних десяткових розпакованих операндів. Коректне десяткове розпаковане число, що складається з 2-х цифр, витягується з регістрів AH і AL, і результат повертається до регістрів AH і AL. Старші полубайта перемножуваних операндів повинні бути обнулені, що необхідно AAM для формування правильного результату. AAM модифікує прапори PF, SF і ZF; стану прапорів AF, CF і OF після AAM не визначені.

2.6. Розподіл.

DIV джерело РОЗПОДІЛ байтів або слів БЕЗ ЗНАКУ
Інструкція DIV виконує беззнаковое розподіл вмісту акумулятора (і його розширення) на вміст джерела. Якщо джерело є байтом, передбачається, що ділене розташоване в регістрах AH і AL. Приватне залишається в регістрі AL, залишок - в регістрі AH. Якщо джерело є словом, передбачається, що ділене розташоване в регістрах DX і AX. Приватне в цьому випадку залишається в регістрі AX, залишок - в регістрі DX. Якщо значення приватного перевершує місткість регістра-приймача (FFh для джерела-байта або FFFFh для джерела-слова), виникає ситуація "ділення на 0" і генерується переривання з номером 0; приватне і залишок у цьому випадку не визначені.
Дрібна частина приватного відсікається. Після DIV стану прапорів AF, CF, OF, PF, SF і ZF не визначені.
IDIV джерело цілочисельного ділення байтів або слів
Інструкція IDIV виконує поділ зі знаком вмісту акумулятора (і його розширення) на вміст джерела. Якщо джерело є байтом, передбачається, що ділене розташоване в регістрах AH і AL. Приватне залишається в регістрі AL, залишок - в регістрі AH. Для такого поділу максимально допустимий позитивне приватне одно 127 (7Fh), а мінімально допустимий негативне приватне одно -127 (81h). Якщо джерело є словом, передбачається, що ділене розташоване в регістрах DX і AX. Приватне в цьому випадку залишається в регістрі AX, залишок - в регістрі DX. Для такого поділу значення приватного може перебувати в межах від -32767 (8001h) до 32767 (7FFFh). Якщо приватне позитивно і перевищує позитивний максимум або негативно і менше негативного мінімуму, генерується переривання з номером 0 (ділення на 0); приватне і залишок у цьому випадку не визначені. Нецелочисленное приватне округляється до цілого числа (у напрямку до 0). Залишок має той же знак, що і ділене. Після IDIV стану прапорів AF, CF, OF, ZF, PF і SF не визначені.
AAD ASCII-НАСТРОЙКА ДЛЯ РОЗПОДІЛУ
Інструкція AAD модифікує чисельник в регістрі AL перед поділом 2-х коректних десяткових розпакованих операндів таким чином, щоб частка від ділення було також коректним десятковим розпакованим числом. Для того, аби надалі інструкція DIV сформувала правильний результат, регістр AH повинен містити нулі. Приватне залишається в регістрі AL, залишок - в регістрі AH; обидва старших полубайта обнуляються. AAD модифікує прапори PF, SF і ZF; стану прапорів AF, CF і OF після AAD не визначені.
CBW ПЕРЕТВОРЕННЯ байт на СЛОВО
Інструкція CBW заповнює регістр AH бітами, рівними знакової біту однобайтное числа у регістрі AL. CBW на стани прапорів не впливає. Ця інструкція може використовуватися для отримання діленого подвійного розміру (слова) з результату попередньої операції ділення байтів.
CWD ПЕРЕТВОРЕННЯ СЛОВА В ПОДВІЙНЕ СЛОВО
Інструкція CWD заповнює регістр DX бітами, рівними знакової біту двухбайтного числа в регист AX. CWD на стани прапорів не впливає. Ця інструкція може використовуватися для отримання діленого подвійного розміру (подвійного слова) з результату попередньої операції ділення слів.

3. ЛІТЕРАТУРА:
1. Асемблер для IBM PC (розділ 13).
2. "Асемблер: довідник" (видавництво "Пітер", 2000 рік).
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Доповідь
39кб. | скачати


Схожі роботи:
Операції введення виведення Арифметичні операції
Операції введення-виведення Арифметичні операції
Арифметичні пристрої
Арифметичні команди
Зображення струмів і напруг комплексними числами
Методика ознайомлення з числами першого десятка
Додаткові арифметичні команди
Знайомство учнів з новими числами на уроці математики
Арифметичні основи роботи ЕОМ
© Усі права захищені
написати до нас