Читайте также: |
|
На примере сложения и вычитания неупакованных чисел стаао понятно, что стандартных алгоритмов для выполнения этих действий над BCD-числами нет, и программист должен сам, исходя из требований к своей программе, реализовать эти операции. Реализация двух оставшихся операций — умножения и деления — еще более сложна. В системе команд микропроцессора присутствуют только средства для производства умножения и деления одноразрядных неупакованных BCD-чисел.
Для того чтобы умножать числа произвольной размерности, нужно реализовать процесс умножения самостоятельно, взяв за основу некоторый алгоритм умножения, например «в столбик*. Позже мы рассмотрим пример программы, выполняющей умножение десятичных чисел произвольной размерности.
Для того чтобы перемножить два одноразрядных BCD-числа, необходимо:
- О поместить один из сомножителей в регистр аl (как того требует команда mul);
- О поместить второй операнд в регистр или память, отведя байт;
- О перемножить сомножители командой mul (результат, как и положено, будет в ах);
- О результат, конечно, получится в двоичном коде, поэтому его нужно скорректировать.
Для коррекции результата после умножения применяется специальная команда
aam (ASCII Adjust for Multiplication) — коррекция результата умножения для представления в символьном виде.
Она не имеет операндов и работает с регистром ах следующим образом:
- О делит al на 10;
- О результат деления записывается так; частное — в al, остаток — в ah.
В результате после выполнения команды aam в регистрах al и ah находятся
правильные двоично-десятичные цифры произведения двух цифр.
В листинге 8.10 приведен пример умножения BCD-числа произвольной размерности на однозначное BCD-число.
Листинг 8.10. Умножений неупакованных BCD-чисел
;prg8_10.asm
masm
model small
stack 256
.data
b db 6,7;неупакованное число 76
c db 4;неупакованное число 4
proizv db 4 dup (0)
.code
main:;точка входа в программу
mov ax,@data
mov ds,ax
xor ax,ax
len equ 2;размерность сомножителя 1
xor bx,bx
xor si,si
xor di,di
mov cx,len;в cx длина наибольшего сомножителя 1
m1:
mov al,b[si]
mul c
aam;коррекция умножения
adc al,dl;учли предыдущий перенос
aaa;скорректировали результат сложения с переносом
mov dl,ah; запомнили перенос
mov proizv[bx],al
inc si
inc bx
loop m1
mov proizv[bx],dl;учли последний перенос
exit:
mov ax,4c00h
int 21h
end main
Данную программу можно легко модифицировать для умножения BCD-чисел произвольной длины. Для этого достаточно представить алгоритм умножения в «столбик». Листинг 8.10 можно использовать для получения частичных произведений в этом алгоритме. После их сложения со сдвигом получится искомый результат. Попробуйте выполнить разработку этой программы самостоятельно. Перед окончанием обсуждения Командуы aam необходимо отметить еще один вариант ее применения. Эту команду можно применять для преобразования двоичного числа в регистре al в неупакованное BCD-число, которое будет размещено в регистре ах: старшая цифра результата — в ah, младшая — в al. Понятно, что Двоичное число должно быть в диапазоне 0...99.
1.4. Делениее:
Процесс выполнения операции деления двух неупакованных BCD-чисел несколько отличается от других, рассмотренных ранее, операций с ними. Здесь также требуются действия по коррекции, но они должны выполняться до основной операции, выполняющей непосредственно деление одного BCD-числа на другое BCD-число. Предварительно в регистре ах нужно получить две неупакованные BCD-цифры делимого. Это делает программист удобным для него способом. Далее нужно выдать команду aad:
aad (ASCII Adjust, for Division) — коррекция деления для представления в символьном виде.
Команда не имеет операндов и преобразует двузначное неупакованное BCD-число в регистре ах в двоичное число. Это двоичное число впоследствии будет играть роль делимого в операции деления. Кроме преобразования, команда aad помещает полученное двоичное число в регистр al. Делимое, естественно, будет двоичным числом из диапазона 0...99. Алгоритм, по которому команда aad осуществляет это преобразование, состоит в следующем:
- О умножить старшую цифру исходного BCD-числа в ах (содержимое ah) на 10;
- О выполнить сложение ah + al, результат которого (двоичное число) занести в al;
- О обнулить содержимое ah.
Далее программисту нужно выдать обычную команду деления div для выполнения деления содержимого ах на одну BCD-цифру, находящуюся и байтовом регистре или байтовой ячейке памяти.
Деление неупакованных BCD-чисел иллюстрируется листингом 8.11.
Листинг 8.11. Деление неупакованных BCD-чисел
;prg8_11.asm
masm
model small
stack 256
.data;сегмент данных
b db 1,7;неупакованное BCD-число 71
c db 4;
ch db 2 dup (0)
.code;сегмент кода
main:;точка входа в программу
mov ax,@data
mov ds,ax
xor ax,ax
mov al,b
aad;коррекция перед делением
div c;в al BCD-частное, в ah BCD-остаток
;...
exit:
mov ax,4c00h
int 21h
end main
Аналогично ааmт, команде aad можно найти и другое применение — использовать ее для перевода неупакованных BCD-чисел из диапазона 0...99 в их двоичный эквивалент.
Для деления чисел большей разрядности, так же, как и в случае умножения, нужно реализовывать свой алгоритм, например в «столбик», либо найти более оптимальный путь. Любопытный и настойчивый читатель, возможно, самостоятельно разработает эти программы. Но это делать совсем необязательно. На дискете, прилагаемой к книге, в каталоге данного урока приведены тексты макрокоманд, которые выполняют четыре основных арифметических действия с BCD-числами любой разрядности.
Дата добавления: 2015-08-27; просмотров: 111 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Вычитание Ш | | | Упакованные BCD-числа |