Учебное пособие: Системне програмування та операційні системи
Приклад запису 3-розрядного десяткового числа 653 у пам`яті в двійково-десятковому неупакованому форматі:
1 | байт | 2 | байт | 3 | байт | |
0 | 6 | 0 | 5 | 0 | 3 | - десяткове представлення |
0000 | 0110 | 0000 | 0101 | 0000 | 0011 | - двійкове представлення |
2.2 Виконання арифметичних операцій
Процесори ІBM PC мають у системі команд такі команди, які дозволяють виконувати арифметичні операції додавання, віднімання, множення і ділення над цілими числами в двійковому форматі, а також у двійково-десятковому упакованому і неупакованому форматах.
2.2.1 Арифметичні команди над двійковими цілими числами
Для виконання додавання цілих двійкових чисел можуть використовуватись команди:
ADD a,b - Додавання без урахування перенесення. Команда додає значення двох операндів а та b і розміщує результат замість першого операнда. Операнд може знаходитися в пам'яті, в регістрі або бути безпосереднім параметром у команді. Не допускається додавання двох операндів, які знаходяться в пам'яті. Першим операндом не може бути безпосередній параметр. Установлюються прапорці AF, CF, OF, FF, SF, ZF.
ADC a,b - Додавання з перенесенням. Команда додає значення двох операндів, а також значення прапорця перенесення CF (a+b+CF), і розміщує результат замість першого операнда. Обмеження на операнді такі ж, як і в команді ADD. Установлюються прапорці AF, CF, OF, FF, SF, ZF. Ця команда використовується для програмування арифметичних операцій над довгими цілими числами.
ІNC a - Збільшення на 1. Команда додає 1 до значення операнда а. Операнд може знаходитися в пам'яті або в регістрі. Установлюються прапорці AF, OF, PF, SF, ZF.
Для виконання віднімання можуть використовуватись команди:
SUB a,b - Віднімання. Команда віднімає вид значення першого операнда а значення другого операнда b і розміщує результат замість першого операнда. Операнд може знаходитися в пам'яті, в регістрі або бути безпосереднім параметром у команді. Не допускається віднімання, коли обидва операнди знаходяться в пам'яті. Першим операндом не може бути безпосередній параметр. Установлюються прапорці AF, CF, OF, PF, SF, ZF.
SBB a,b - Віднімання з позикою. Команда віднімає із значення першого операнда а значення другого операнда b, зменшує результат на значення прапорця CF (a-b-CF) і розміщує результат замість першого операнда. Обмеження операндів такі ж, як і в команді SUB. Установлюються прапорці AF, CF, OF, PF, SF, ZF.
DEC a - Зменшування на 1. Команда зменшує значення операнда а на 1. Операнд може знаходитися в пам'яті або в регістрі. Установлюються прапори AF, OF, PF, SF, ZF.
Для виконання множення цілих двійкових чисел можуть використовуватись команди:
MUL a - Множення. Команда виконує множення вмісту акумулятора (AL або AX) на значення операнда а. Результат розміщується відповідно в акумуляторі AX або в парі регістрів DX: AX. Множники розглядаються як числа без знаків. Установлюються прапорці CF і OF. Прапорці AF, PF, SF і ZF не визначені.
ІMUL a - Множення із знаком. Команда виконує множення вмісту акумулятора (AL або AX) на значення операнда а. Результат розміщується відповідно в акумуляторі AX або в парі регістрів DX: AX. Множники розглядаються як числа із знаками. Прапорці CF і OF скидаються в 0, коли старша частина добутку (регістр AH або DX) є поширенням знака, який знаходиться в молодшій частині добутку (AL або AX), інакше ці прапорці установлюються в 1.
Для виконання ділення цілих двійкових чисел можуть використовуватися команди:
DІV a - Ділення. Команда виконує ділення вмісту акумулятора на операнд a. Коли операнд а - байт, тоді ділене розміщується в AX, ціла частина в AL, а залишок - в AH. Коли операнд a - слово, тоді ділене розміщується в парі DX: AX (подвійне слово), ціла частина розміщується в AX, а залишок в DX. Операнди розглядаються як цілі числа без знака. При діленні на 0 виконується переривання типу 0.
ІDІV a - Ділення із знаком. Команда виконує ділення операндів так само, як у команді DІV. Операнди розглядаються як числа із знаками. Прапорці не визначені. При діленні на 0 виконується переривання типу 0.
2.2.2 Арифметичні команди над двійково-десятковими неупакованими числами
Арифметичні операції над двійково-десятковими неупакованими числами виконуються порозрядно, починаючи з молодших розрядів операндів.
Слід нагадати, що для зберігання однієї цифри такого числа треба один байт.
Виконання операції над черговими розрядами операндів, тобто над черговими байтами, починається з того, що над цими байтами виконується відповідна двійкова команда додавання (ADD, ADC), віднімання (SUB, SBB), множення (MUL) або ділення (DІV).
Після того виконується корекція отриманого результату, щоб отримати правильне значення неупакованої десяткової цифри результату:
ААА - Команда коригує в AL результат операції ADD, ADC. У чотирьох молодших бітах регістра AL записується значення десяткової цифри, а в чотирьох старших бітах записуються нулі. Коли в AL результат попередньої операції перевищує 9, тоді CF=1 і AH=AH+1.
AAS - Команда коригує в AL результат операції SUB, SBB. У чотирьох молодших бітах регістра AL записується значення десяткової цифри, а в чотирьох старших бітах записуються нулі. Коли потрібно мати позику із старшого розряду, тоді CF=1 і AH=AH+1.
AAM - Корекція в AX результату множення. Команда коригує результат операції MUL. У регістрі AH записується старша цифра добутку, а в AL - молодша цифра.
AAD - Корекція ділення. Команда коригує ділене в регістрі AL перед виконанням ділення, так що наступне ділення DІV дає неупаковану десяткову частку: в AL - результат, в AH - нуль.
2.2.3 Арифметичні команди над двійково-десятковими упакованими числами
Арифметичні операції над двійково-десятковими упакованими числами виконуються по байтах, тобто задана операція додавання або віднімання виконується одночасно над двома розрядами числа, які знаходяться в одному байті, починаючи з молодших розрядів.
Виконання операції додавання або віднімання здійснюється в два етапи. Спочатку над цим байтом виконується команда додавання (ADD, ADC) або віднімання (SUB, SBB), а потім виконується корекція результату, щоб отримати правильні значення упакованих десяткових цифр.
Для корекції результату використовуються такі команди:
DAA - Корекція результату додавання. Команда коригує в AL результат операції ADD, ADC. У регістрі AL створюються дві правильні двійково-десяткові цифри результату. Коли виникає перенесення в наступний байт, тоді CF=1.
DAS - Корекція результату віднімання. Команда коригує в AL результат операції SUB, SBB. У регістрі AL створюються дві правильні двійково-десяткові цифри результату. Коли виникає позика із наступного байта, тоді CF=1.