Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Умножение I

Десятичные числа | Сложение двоичных чисел без знака | Сложение двоичных чисел со знаком | Вычитание двоичных чисел без знака | Вычитание двоичных чисел со знаком j | Вычитание и сложение операндов большой размерности | Умножение двоичных чисел без знака ; ; | Деление двоичных чисел без знака | Команды преобразования типов | Над двоично-десятичными числами |


Читайте также:
  1. Линейные операции над матрицами. Умножение матриц. Обратная матрица
  2. Остальные числа рядов получаются умножением или делением чисел исходных рядов на 10, 100, 1000, ... .
  3. Сложение. Вычитание. Умножение. Деление.
  4. Умножение вектора на число
  5. Умножение двоичных чисел без знака ; ;
  6. Умножение и деление

На примере сложения и вычитания неупакованных чисел стаао понятно, что стан­дартных алгоритмов для выполнения этих действий над 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-числа

mybiblioteka.su - 2015-2024 год. (0.008 сек.)