Одна из возможных реализаций этого алгоритма приведена в Программе 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.