- •Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера
- •4.1. Арифметичні дії над неупакованими bcd-числами
- •4.1.1. Додавання неупакованих bcd-чисел
- •4.1.2. Віднімання неупакованих bcd-чисел
- •4.1.3. Множення неупакованих bcd-чисел
- •4.1.4. Ділення неупакованих bcd-чисел
- •4.2. Арифметичні дії над упакованими bcd-числами
- •4.2.1. Додавання упакованих bcd-чисел
- •4.2.2. Віднімання упакованих bcd-чисел
4.1.4. Ділення неупакованих bcd-чисел
Процес виконання операції ділення двох неупакованих BCD-чисел дещо відрізняється від інших, розглянутих раніше, операцій з ними. Тут також потрібні дії щодо корекції, але вони повинні виконуватися перед основною операцією, котра виконує безпосередньо ділення одного BCD-числа на інше BCD-число. Попередньо в регістрі ax потрібно отримати дві неупаковані BCD-цифри діленого. Це робить програміст зручним для нього способом. Далі потрібно видати команду aad:
aad (ASCII Adjust for Division) —- Корекція ділення для представлення в символьному вигляді.
Команда не має операндів і перетворює двозначне неупаковане BCD-число в регістрі ax в двійкове число. Це двійкове число згодом буде грати роль діленого в операції ділення. Крім перетворення, команда aad поміщає отримане двійкове число в регістр al. Ділене, природно, буде двійковим числом з діапазону 0 ... 99. Алгоритм, за яким команда aad здійснює це перетворення, полягає в наступному:
• помножити старшу цифру початкового BCD-числа в ax (зміст ah) на 10;
• виконати додавання ah + al, результат якого (двійкове число) занести в al;
Лістинг 9. Ділення неупакованих BCD-чисел <1> ;prg_10_4.asm <2> ... <3> .data ;сегмент даних <4> b db 1,7 ;неупаковане BCD-число 71 <5> c db 4 ; <6> ch db 2 dup (0) <7> .code ;сегмент кода <8> main: ;точка входу в програму <9> ... <10> mov al,b <11> aad ;корекція перед діленням <12> div c ; в al BCD-частка, в ah BCD-залишок <13> ... <14> exit: |
Далі програмісту потрібно видати звичайну команду ділення div для виконання ділення вмісту ax на одну BCD-цифру, що знаходиться в байтовому регістрі або комірці пам'яті. Ділення неупакованих BCD-чисел ілюструється лістингом 9.
Аналогічно aam, команді aad можна знайти й інше застосування - використовувати її для перекладу неупакованих BCD-чисел з діапазону 0 ... 99 в їх двійковий еквівалент.
Для ділення чисел більшої розрядності, так само як і у випадку множення, потрібно реалізовувати свій алгоритм, наприклад "у стовпчик", або знайти оптимальний шлях.
4.2. Арифметичні дії над упакованими bcd-числами
Як вже зазначалося вище, упаковані BCD-числа можна тільки додавати і віднімати. Для виконання інших дій над ними їх потрібно додатково перетворювати або в неупакований формат, або в двійкове подання. Через те, що упаковані BCD-числа становлять не надто великий інтерес, ми їх розглянемо коротко.
4.2.1. Додавання упакованих bcd-чисел
Приклад
13. Додавання
упакованих
BCD-чисел 67
= 0110 0111
+
75
= 0111 0101 142
= 1101 1100 = 220
Лістинг 10. Додавання упакованих BCD-чисел <1> ;prg_10_5.asm <2> ... <3> .data ;сегмент даних <4> b db 17h ;упаковане число 17h <5> c db 45h ;упаковане число 45 <6> sumdb 2 dup (0) <7> .code ;сегмент коду <8> main: ;точка входу в програму <9> ... <10> mov al,b <11> add al,c <12> daa <13> jnc $+4 ; перехід через команду, якщо результат <= 99 <14> mov sum+1,ah ; обрахування переносу при додаванні ; (результат > 99) <15> mov sum,al ; молодші упаковані цифри результату <16> exit: |
Видно, що як і для неупакованих BCD-чисел, для упакованих BCD-чисел існує потреба якось коректувати результати арифметичних операцій. Мікропроцесор надає для цього команду daa:
daa (Decimal Adjust for Addition) - Корекція результату додавання для подання в десятковому вигляді. Команда daa перетворює вміст регістра al у дві упаковані десяткові цифри за алгоритмом, наведеним в описі команди daa.
Одиниця, що вийшла в результаті додавання (якщо результат додавання більше 99) запам'ятовується в прапорі cf, тим самим враховується перенесення в старший розряд. Проілюструємо сказане на прикладі додавання двох двозначних BCD-чисел в упакованому форматі (лістинг 10).
У наведеному прикладі все досить прозоро, єдине, на що слід звернути увагу, - це опис упакованих BCD-чисел і порядок формування результату. Результат формується у відповідності з основним принципом роботи мікропроцесорів Intel: молодший байт за молодшому адресою.