Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа МП-3.doc
Скачиваний:
31
Добавлен:
02.05.2014
Размер:
344.58 Кб
Скачать

3.2. Десятичное сложение.

Любую четырёх битовую величину данных можно рассматривать как десятичную цифру от 0 до 9,если не содержит комбинации,соответствующие шестнадцатеричным цифрам отA до F. Десятичное сложение выполняется при допущении ,что каждый байт содержит две четырехбитовые десятичные цифры.

Байты суммируются в аккумуляторе стандартным способом, а команда DAA(десятичная коррекция А)применяется затем для преобразования 8-битного результата в правильное представление двух десятичных цифр. Установка битов переноса влияет на операцию DAA, что даёт возможность складывать многоразрядные числа.

Рассмотрим подробнее процесс выполнения команды DAA. Эта команда преобразует в аккумуляторе 8-битное двоичное число в две четырёхбитные двоично-кодированные десятичные цифры (в кодеBCD). Это происходит с учётом следующих правил:

  1. Если младшие 4 бита содержимого аккумулятора представляют число >9 или бит вспомогательного переноса установлен, то содержимое аккумулятора увеличивается на 6. В противном случае содержимое аккумулятора не изменяется.

  2. Если после первого действия старшие 4 бита содержимого аккумулятора представляют число >9 или установлен, бит переноса, то старшие 4 бита инкрементируются на 6. В противном случае содержимое аккумулятора не изменяется.

Пример. Пусть необходимо сложить два десятичных числа:

2985

4936

7921

Для этого в программе необходимо выполнить следующее.

  1. Сбросить бит переноса и сложить младшие байты (это будет соответствовать сложению двух младших десятичных цифр).

85=10000101

36=00110110

перенос=0

10111011

С=0

Вспомогательный пернос =0

  1. Выполнить команду DAA.

Поскольку первые 4 бита >9, то будет прибавлено 6 к содержимому аккумулятора:

(А)=10111011

6 = 0110

21= 00100001

перенос С=1

3. Аккумулятор содержит теперь число 21. Складываем теперь две следующие цифры:

29=00101001

49=01001001

перенос=1

01110011

С=0

АС=1

4. Выполняем команду DAA.

Т.к. бит вспомогательного переноса АС установлен, то 6 будет прибавлено к аккумулятору:

(А)=01110011

6 = 0110

79= 01111001

С=0

Т.к. левые 4 бита <9, а бит переноса сброшен, то никаких дальнейших действий не происходит. Таким образом, правильный десятичный результат равен 7921.

Для сложения десятичных чисел вполне подходит подпрограмма для сложения многобайтных чисел (MADD). Требуется только ввести команду DAAпосле командыADCM.Каждая итерация программного цикла в такой подпрограмме будет складывать по 2 десятичные цифры.

3.3. Умножение.

Умножение двух 8-битных чисел без знака может быть выполнена несколькими способами. Например, путём повторного сложения либо применения операции регистрового сдвига.

Повторное сложение обеспечивает простейшую, но самую медленную форму умножения. Например, произведение 20Н*30АН может быть получена путём прибавления 20Н к аккумулятору (предварительно обнулённому) 3А раз.

Используя операцию сдвига, можно получить более быстрое умножение. Отметим ещё особенность умножения двоичных чисел:

011=3

110=6

000

011

011

10010=18

При умножении множителя на соответствующий разряд множителя будет получен либо множитель, либо нуль.

Итак, алгоритм умножения будет включать в себя следующие операции:

  1. Проверка бита множителя, начиная с младшего разряда; если 1, то прибавить множимое к старшему байту промежуточного результата (при проверке самого младшего бита множителя значение промежуточного результата равно нулю); если бит множителя равен нулю, то переход к пункту 2;

  2. Сдвиг всего 2-байтового промежуточного результата вправо на 1 бит.

Повторение пунктов 1 и 2, необходимо производить до тех пор, пока не будут проверены все восемь бит множителя.

Далее приведена подпрограмма умножения MULT, обеспечивающая выполнение рассмотренного алгоритма, с учётом следующих начальных условий:

 регистр В содержит старший байт результата умножения (промежуточного и окончательного);

 регистр С перед началом подпрограммы содержит множитель, а по завершению младший байт результата умножения;

  • регистр Dсодержит множимое.

Сдвиг 16-битного промежуточного результата выполняется двумя командами RAR по следующей схеме:

В начале сдвиг регистра С

7 0 7 0

B

C

C

Затем сдвиг регистра В

7 0 7 0

B

C

C

MULT: MVI B,0 ; обнуление старшего байта результата

MVI E,9 ;установка счётчика бит

MULT0: MOV A,C ; множитель в аккумулятор

RAR ; сдвиг множителя младшего байта результата

MOV C,A ; хранение результата

DCR E ; счётчик равен 0?

JZ DONE ; если да, то конец

MOV A,B ; иначе старший байт результатаА

JNC MULT1 ;младший бит множителя =0?Если да, то переход поMULT1

ADD D ;прибавление множимого к старшему байту результата

MULT1: RAR ;сдвиг старшего байта результата

MOV B,A ;хранение старшего байта результата

JMP MULT0 ; цикл

DONE: RET

Рассмотрим пример выполнения подпрограммы MULTпри умножении 2 чисел2AH*3CH=9D8H

Исходное состояние: (B)=00000000 (старший байт результата);

(С)=00111100=СН (множитель, по окончании умножения младший байт результата);

(D)=00101010=2AH (множимое).

Изменение содержимого регистров запишем в таблицу:

цикла

Операция

Содержимое (В)

Флаг С после 2 сдвига

(С)

Флаг с после 1 сдвига

1

ADD

RAR

00000000

00000000

0

00011110

0

2

ADD

RAR

00000000

00000000

0

00001111

0

3

ADD

RAR

00101010

00010101

0

00000111

1

4

ADD

RAR

00111111

00011111

1

00000011

1

5

ADD

RAR

01001001

00100100

1

10000001

1

6

ADD

RAR

01001110

00100111

0

11000000

1

7

ADD

RAR

00100111

00010011

1

01100000

0

8

ADD

RAR

00010011

00001001

1

10110000

0

9

ADD

RAR

00001001

11011000

0

0 9 D 8