- •Программирование арифметических операций в системе команд микропроцессора кр580вм80
- •2. Основные теоретические сведения.
- •3. Приёмы программирования типовых арифметических задач.
- •3.2. Десятичное сложение.
- •3.3. Умножение.
- •4. Порядок выполнения работы.
- •5. Содержание отчёта.
- •6. Контрольные вопросы.
3.2. Десятичное сложение.
Любую четырёх битовую величину данных можно рассматривать как десятичную цифру от 0 до 9,если не содержит комбинации,соответствующие шестнадцатеричным цифрам отA до F. Десятичное сложение выполняется при допущении ,что каждый байт содержит две четырехбитовые десятичные цифры.
Байты суммируются в аккумуляторе стандартным способом, а команда DAA(десятичная коррекция А)применяется затем для преобразования 8-битного результата в правильное представление двух десятичных цифр. Установка битов переноса влияет на операцию DAA, что даёт возможность складывать многоразрядные числа.
Рассмотрим подробнее процесс выполнения команды DAA. Эта команда преобразует в аккумуляторе 8-битное двоичное число в две четырёхбитные двоично-кодированные десятичные цифры (в кодеBCD). Это происходит с учётом следующих правил:
Если младшие 4 бита содержимого аккумулятора представляют число >9 или бит вспомогательного переноса установлен, то содержимое аккумулятора увеличивается на 6. В противном случае содержимое аккумулятора не изменяется.
Если после первого действия старшие 4 бита содержимого аккумулятора представляют число >9 или установлен, бит переноса, то старшие 4 бита инкрементируются на 6. В противном случае содержимое аккумулятора не изменяется.
Пример. Пусть необходимо сложить два десятичных числа:
2985
4936
7921
Для этого в программе необходимо выполнить следующее.
Сбросить бит переноса и сложить младшие байты (это будет соответствовать сложению двух младших десятичных цифр).
85=10000101
36=00110110
перенос=0
10111011
С=0
Вспомогательный пернос =0
Выполнить команду 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, то прибавить множимое к старшему байту промежуточного результата (при проверке самого младшего бита множителя значение промежуточного результата равно нулю); если бит множителя равен нулю, то переход к пункту 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