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

4.1.3. Множення неупакованих bcd-чисел

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

Для того щоб множити числа довільної розмірності, потрібно реалізувати процес множення самостійно, взявши за основу деякий алгоритм множення, наприклад "у стовпчик".

Для того, щоб помножити два однорозрядних BCD-числа, необхідно:

• помістити один з співмножників в регістр al (як того вимагає команда mul);

• помістити другий операнд в регістр або пам'ять, відвівши байт;

• перемножити співмножники командою mul (результат, як і належить, буде в ax);

• результат, звичайно, вийде в двійковому коді, тому його потрібно скоректувати.

Для корекції результату після множення застосовується спеціальна команда

aam (ASCII Adjust for Multiplication) — Корекція результату множення для представлення в символьному вигляді.

Лістинг 8. Множення неупакованих BCD-чисел

<1> masm

<2> model small

<3> stack 256

<4> .data

<5> b db 6,7 ; неупаковане число 76

<6> c db 4 ; неупаковане число 4

<7> proizv db 4 dup (0)

<8> .code

<9> main: ; точка входа в програму

<10> mov ax,@data

<11> mov ds,ax

<12> xor ax,ax

<13> len equ 2 ; розмірність співмножника 1

<14> xor bx,bx

<15> xor si,si

<16> xor di,di

<17> mov cx,len ;в cx довжина найбільшого співмножника 1

<18> m1:

<19> mov al,b[si]

<20> mul c

<21> aam ; корекція множення

<22> adc al,dl ; врахували попереднє перенесення

<23> aaa ; скорегували результат додавання з переносом

<24> mov dl,ah ; запам'ятали перенесення

<25> mov proizv[bx],al

<26> inc si

<27> inc bx

<28> loop m1

<29> mov proizv[bx],dl ; врахували останнє перенесення

<30> exit:

<31> mov ax,4c00h

<32> int 21h

<33> end main

Вона не має операндів і працює з регістром ax наступним чином:

• ділить al на 10;

• результат ділення записується так: частка в al, залишок у ah.

В результаті після виконання команди aam в регістрах al і ah знаходяться правильні двійково-десяткові цифри добутку двох цифр. У лістингу 8 наведено приклад множення BCD-числа довільної розмірності на однозначне BCD-число.

Цю програму можна легко модифікувати для множення BCD-чисел довільної довжини. Для цього достатньо представити алгоритм множення "у стовпчик". Лістинг 8 можна використовувати для отримання часткових добутків у цьому алгоритмі. Після їх додавання зі зсувом вийде потрібний результат.

Перед закінченням обговорення команди aam необхідно відзначити ще один варіант її застосування. Цю команду можна застосовувати для перетворення двійкового числа в регістрі al в неупаковане BCD-число, яке буде розміщене в регістрі ax: старша цифра результату в ah, молодша - в al. Зрозуміло, що двійкове число повинне бути в діапазоні 0 ... 99.

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