; Глобальные объявления
STATUS equ 3
; Регистр STATUSС equ 0
; Флаг переноса — бит 0z equ 2
; Флаг нуля — бит 2MULTIPLIER equ h’20’
; МножительMULTIPLICAND equ h’21’
; МножимоеPRODUCT_L equ h’2E’
; Произведение, младший байтPRODUCT_H equ h’2F’
; Произведение, старший байт; Подпрограмма MUL
; ************************
; * ФУНКЦИЯ: Перемножает два байта и возвращает 2-байтное произведение *
; * ПРИМЕР: MULTIPLICAND = h’10’, MULTIPLIER = h’FF’ *
; * : PRODUCT_H: PRODUCT_L = h’0FF0’ (d’16 x 255 = 4080’) *
; * ВХОД: MULTIPLIER = per. h’20’, MULTIPLICAND = per. h’21’ *
; * ВЫХОД: PRODUCT_H = per. h’2E’, PRODUCT_L = per. h’2F’ *
; * : MULTIPLIER, MULTIPLICAND изменяются *
; * : W, STATUS и MULTIPLICANDS = per. h’30’ изменяются*
; **************
;Локальные объявления
MULTIPLICANDS equ h’30’
; Байт для расширения множимого; Задача 1: Обнулить произведение
MUL clrf PRODUCT_L
clrf PRODUCT_H
; Задача 2: Расширить множимое до 16-битного числа
clrf MULTIPLICANDS
; Задача 3: ВЫПОЛНЯТЬ
; Задача За: Сдвинуть множитель на один бит вправо
MUL_LOOP bcf STATUS,С
; Сбрасываем флаг переносаrrf MULTIPLIER,f
; Задача 3б: ЕСЛИ С == 1, ТО прибавить множимое к произведению
btfss STATUS,С
;ЕСЛИ С == 1, TO складываемgoto MUL_CONT
; ИНАЧЕ пропускаем эту задачуmovf MULTIPLICAND,w
; Выполняем сложениеaddwf PRODUCTS,f
; Сначала младшие байтыbtfsc STATUS,С
; ЕСЛИ нет переноса, ТО переходим к старшимincf PRODUCTS,f
; ИНАЧЕ учитываем переносmovf MULTI PLICANDS,w
; Теперь старшие байтыaddwf PRODUCTS, f
; Задача 3в: Сдвинуть множимое на один бит влево (х2)
MUL_CONT bcf STATUS,С
; Обнуляем бит переносаrlf MULTIPLICAND,f
rlf MULTIPLICANDS_H,f
; ПОКА множитель не станет равным нулю
movf MULTIPLIERS,f
; Проверяем множитель на нольbtfss STATUS,Z
goto MUL_LOOP
; ЕСЛИ не ноль, ТО повторяемreturn;
ИНАЧЕ выходим из подпрограммыВ самом начале Программы 6.7 объявлены переменные, которые передаются в/из подпрограммы. Размещение всех этих
Код программы в точности соответствует приведенному алгоритму. Принятие решения о том, прибавлять или нет сдвинутое влево 2-байтное множимое к частичному произведению, основывается на состоянии флага переноса после сдвига множителя вправо. Таким образом, реализуется условное сложение
Произведение = произведение + (множимое <<