- •Тема 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.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 |
• ділить al на 10;
• результат ділення записується так: частка в al, залишок у ah.
В результаті після виконання команди aam в регістрах al і ah знаходяться правильні двійково-десяткові цифри добутку двох цифр. У лістингу 8 наведено приклад множення BCD-числа довільної розмірності на однозначне BCD-число.
Цю програму можна легко модифікувати для множення BCD-чисел довільної довжини. Для цього достатньо представити алгоритм множення "у стовпчик". Лістинг 8 можна використовувати для отримання часткових добутків у цьому алгоритмі. Після їх додавання зі зсувом вийде потрібний результат.
Перед закінченням обговорення команди aam необхідно відзначити ще один варіант її застосування. Цю команду можна застосовувати для перетворення двійкового числа в регістрі al в неупаковане BCD-число, яке буде розміщене в регістрі ax: старша цифра результату в ah, молодша - в al. Зрозуміло, що двійкове число повинне бути в діапазоні 0 ... 99.