STATUS equ 3
; Регистр STATUS расположен по адресу h’03’С equ 0
; Флаг переноса — бит 0BINARY 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.