Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._10.doc
Скачиваний:
2
Добавлен:
05.05.2019
Размер:
142.85 Кб
Скачать

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:

• обнулити вміст ah.

Далі програмісту потрібно видати звичайну команду ділення 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

Спочатку розберемося з суттю проблеми і спробуємо додати два двозначних упакованих BCD-числа.

Лістинг 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:

Як бачимо, в двійковому вигляді результат дорівнює 1101 1100 (або 220 в десятковому поданні), що невірно. Це відбувається з тієї причини, що мікропроцесор не підозрює про існування BCD-чисел і додає їх за правилами додавання двійкових чисел. Насправді, результат в двійковій-десятковому вигляді повинен бути рівний 0001 0100 0010 (або 142 в десятковому поданні).

Видно, що як і для неупакованих BCD-чисел, для упакованих BCD-чисел існує потреба якось коректувати результати арифметичних операцій. Мікропроцесор надає для цього команду daa:

daa (Decimal Adjust for Addition) - Корекція результату додавання для подання в десятковому вигляді. Команда daa перетворює вміст регістра al у дві упаковані десяткові цифри за алгоритмом, наведеним в описі команди daa.

Одиниця, що вийшла в результаті додавання (якщо результат додавання більше 99) запам'ятовується в прапорі cf, тим самим враховується перенесення в старший розряд. Проілюструємо сказане на прикладі додавання двох двозначних BCD-чисел в упакованому форматі (лістинг 10).

У наведеному прикладі все досить прозоро, єдине, на що слід звернути увагу, - це опис упакованих BCD-чисел і порядок формування результату. Результат формується у відповідності з основним принципом роботи мікропроцесорів Intel: молодший байт за молодшому адресою.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]