STATUS equ 3; Регистр STATUS расположен по адресу h’03’
С equ 0; Флаг переноса — бит 0
BINARY equ h’20’; Исходное число
TENS equ h’21’; Частное (число десятков)
UNITS equ h’22’; Остаток (число единиц)
; Сначала делим на 10
BIN_2_BCD clrf TENS; Обнуляем счетчик цикла
movf BINARY,w; Копируем исходный байт в W
; Вычитаем 10 и считаем кол-во вычитаний до генерации заема
LOOP incf TENS,f; Запомнили очередную операцию
addlw — d’10’; Вычли десять
btfsc STATUS,С; ЕСЛИ заем (С == 0), ТО выходим из цикла
goto LOOP; ИНАЧЕ вычитаем еще раз
; Корректируем лишнее вычитание и определяем число единиц
decf TENS,f; Последняя операция вычитания — лишняя
addlw d’10’; Прибавляем 10 к оставшемуся значению
movwf UNITS; Получаем остаток от деления (число единиц)
... ...; Следующая процедура
Другим подходом к делению является представление делителя в виде суммы чисел, являющихся дробными степенями двойки. К примеру, дробь 1/3 можно приближенно выразить следующим образом:
На основе этого ряда напишите программу, которая будет делить число
В качестве временных переменных для хранения частного и количества сдвигов можно использовать соответственно регистры h’20’ и h’21’.
Решение
Сначала в Программе 5.8 обнуляется байт частного, а число из W копируется в регистр Ь’21’. После этого исходное число сдвигается вправо для получения различных дробей, которые либо прибавляются, либо вычитаются из регистра h’20’, постепенно формируя искомое частное.
При последнем члене ряда, равном 1/129, результат равен 0.3359375, т. е. отклонение от точного значения составляет 0.78 %. При работе с 8-битными числами включать в ряд остальные члены не имеет смысла.
Если же необходима большая точность, то исходное значение следует расширить до 16 бит, добавив младший нулевой байт. Используя при этом 2-байтные арифметические операции и операции сдвига, можно будет увеличить число членов ряда и получить точность вплоть до 1/32768.
Программа 5.8.