Одна из возможных реализаций этого алгоритма приведена в Программе 5.6. В программе исходный байт сдвигается влево до тех пор, пока остаток не станет равным нулю. Если в результате сдвига устанавливается флаг переноса, то инкрементируется счетчик единичных битов. При выходе из счетчика битов вычитается двойка. Если результат вычитания равен нулю, процедура завершается с нулевым значением в W, индицирующим корректность числа. В противном случае в W загружается число h’FF’ для индикации ошибки. Это значение соответствует числу — 1 и традиционно используется для сообщения об ошибочных ситуациях. Существует всего 20 комбинаций с двумя установленными битами, из которых только 10 являются корректными. Можете ли вы доработать программу таким образом, чтобы исключить из рассмотрения эти дополнительные комбинации?
STATUS equ 3
; Регистр STATUS расположен по адресу h’03’С equ 0
; Бит 0 — флаг переносаZ equ 2
; Бит 2 — флаг нуляBI_QUIN equ 20h
; Проверяемый байтCOUNT equ 21h
; Счетчик битовBI_QUINARY clrf COUNT
; Обнуляем счетчик битов; Задача 1
LOOP bcf STATUS,С
; Сбрасываем флаг переносаrlf BI_QUIN,f
; Сдвигаем байт влевоbtfsc STATUS,С
; ЕСЛИ нет переноса, ТО пропускаем командуincf COUNT,f
; Инкрементируем счетчикmovf BI_QUIN,f
; Проверяем остатокbtfss STATUS,Z
; ЕСЛИ ноль, ТО выходим из циклаgoto LOOP
; ИНАЧЕ повторяем цикл; Задачи 2 и 3
movf COUNT,w
; Берем подсчитанное значениеsublw 2
; Сравниваем его с двумяbtfss STATUS,Z
; ЕСЛИ ноль, завершаем программу (W = 0)movlw h’FF’
; ИНАЧЕ помещаем h’FF’ (-1) в W... ...; и выходим
Микроконтроллеры PIC младшего и среднего уровней не имеют команд для непосредственного умножения или деления[88]
. Однако для реализации этих важных арифметических операций можно использовать сложение и вычитание.Например, для деления числа на 10 можно подсчитать, сколько раз можно вычесть из исходного числа десять без формирования бита заема. Подсчитанное таким образом значение будет частным, а оставшееся после вычитаний значение — остатком отделения. Используя этот способ, напишите программу для преобразования двоичного числа, меньшего или равного h’63’ (десятичное 99), находящегося в регистре h’20’, в два BCD-числа, помещаемые в регистры Ь’21’ (десятки) и h’22’ (единицы); см. стр. 20.
Решение
При делении числа на 10 формируется частное от 0 до 9 (напоминаю, что максимальное значение по условиям задачи равно 99) и остаток. Частное представляет собой число десятков, а остаток — число единиц.
Самым простым решением этой задачи, блок-схема которого изображена на Рис. 5.20, является циклическое вычитание десяти (addlw — d’10’
или addlw — h’0А’). В регистре TENS будет подсчитываться количество операций вычитания, выполненных до момента генерации заема, — искомое число десятков на единицу меньше подсчитанного значения. Прибавив к оставшемуся значению число 10, получим остаток отделения, т. е. число единиц.Рис. 5.20.