; Глобальные объявления
STATUS equ 3; Регистр STATUS
С equ 0; Флаг переноса — бит 0
z equ 2; Флаг нуля — бит 2
MULTIPLIER 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-байтное множимое к частичному произведению, основывается на состоянии флага переноса после сдвига множителя вправо. Таким образом, реализуется условное сложение
Произведение = произведение + (множимое <<