Аналогичным образом команда subwfb вычитает из заданного регистра содержимое W плюс бит заема, сформированный предыдущими арифметическими операциями. Также появилась команда subfwb, которая выполняет вычитание в обратном порядке, т. е. рабочий регистр вычитается из регистра данных.
Все команды сложения, вычитания, а также команды инкрементирования и декрементирования обеспечивают полную поддержку чисел со знаком, представленных в дополнительном коде (в сочетании с флагами N и OV). Команды incf и decf теперь воздействуют на все флаги арифметических операций, упрощая, таким образом, выполнение многобайтных вычислений (напоминаю, раньше эти команды воздействовали только на флаг Z). Новая команда negf вычисляет дополнительный код числа, находящегося в заданном регистре. Соответственно если в регистре находилось число со знаком, то значение знака меняется на противоположное.
Одной из наиболее важных операций при цифровой обработке сигналов является операция умножения. Поэтому в систему команд были добавлены две команды умножения, вычисляющие за один машинный цикл 16-битное произведение двух беззнаковых 8-битных чисел, как показано в Программе 16.1. На базе этих команд можно создавать относительно короткие подпрограммы для умножения многобайтных чисел, представленных в дополнительном коде.
Команда десятичной коррекции daw упрощает реализацию сложения чисел, представленных в BCD-коде. Как мы уже говорили на стр. 111, при выполнении операций над такими числами с использованием обычной двоичной арифметики результат необходимо корректировать, чтобы исключить шесть избыточных значений Ь’1011’…Ь’1111’. Команда daw осуществляет такую коррекцию, будучи выполнена сразу же после команд сложения или инкрементирования упакованных BCD-чисел (два BCD-разряда хранятся в одном байте). Пример использования этой команды приведен в Программе 16.3, которая выполняет те же действия, что и Программа 4.1. Заметьте, что команда daw не преобразует двоичное число в BCD-формат, она просто осуществляет коррекцию после сложения данных, уже представленных в упакованном BCD-формате.
BCD_INC incf BCD,w; Инкрементируем BCD-число по правилам двоичной арифметики
daw; Корректируем его для приведения к формату BCD
movwf BCD; и помещаем результат обратно в регистр
К командам сброса и установки отдельных битов регистров данных была добавлена третья команда btg, позволяющая инвертировать значение заданного бита регистра. Для примера в Программе 16.4 генерируется последовательность из 20 прямоугольных импульсов на выводе RA0, длительность каждого из которых составляет 8 машинных циклов. Причем формирование этих импульсов осуществляется по аналогии с кодом, относящимся к Рис. 5.19 (стр. 156). Обратите внимание на использование команды decfsz непосредственно с рабочим регистром, который в данном случае представляется в виде РСН с именем WREG.
; Конфигурируем порт А
movlw b’0110’; Конфигурируем порт А как цифровой
movwf ADCON1
bcf LATA,0; Начнем с НИЗКОГО уровня на выводе RA0
bcf TRISA,0; Делаем RA0 выходом
; Где-то в программе ----------
movlw d’40’; Загружаем в W число 40
LOOP btg LATA,0; Изменяем состояние вывода RA0 1~
decfsz WREG,f; Декрементируем до нуля 1|3~
goto LOOP; ИНАЧЕ выходим из цикла 2~
... ...; Далее
В ядре PIC18 команда goto занимает два слова памяти программ. Поэтому при выполнении команды decfsz произойдет переход на второе слово команды goto. Именно по этой причине машинный код второго слова всех четырех двухсловных команд таков, что при непосредственном переходе на это слово оно интерпретируется как команда nор. Из-за этого время выполнения команды увеличивается на один машинный цикл.
И наконец, команда setf предоставляет программисту возможность непосредственно устанавливать все биты заданного регистра в 1, дополняя, таким образом, команду clrf, имевшуюся в предыдущих семействах.
Команды логических операций и операций сдвига