incf h’22’,f; Инкрементируем содержимое регистра h’22’
movf h’22’,w; и копируем его в W
либо так:
incf h’22’,w; Копируем инкрементированное содержимое регистра h’22’ в W
Разумеется, в последнем случае содержимое регистра данных не изменяется.
∙ swapf
Команда swapf переставляет местами старший и младший полубайты содержимого регистра данных и помешает результат либо в тот же регистр данных, либо в рабочий регистр. Например, команда swapf h’22’,w выполнит операцию:
Команда swapf полезна в тех случаях, когда полубайты регистра используются для хранения BCD-чисел, однако может использоваться и для копирования содержимого регистра данных в W. В отличие от более понятной команды movf [File],w состояние флага Z при этом не изменяется. Недостатком, конечно же, будет перестановка полубайтов местами при копировании.
В Программе 7.2 на стр. 226 команда swapf используется именно с этой целью.
Процессоры микроконтроллеров PIC младшего и среднего уровня помимо сложения и вычитания могут выполнять и другие арифметические операции. В качестве примера можно отметить операции сброса, инкрементирования и декрементирования. В Табл. 5.2 также перечислены команды, устанавливающие или сбрасывающие заданный бит в указанном регистре данных.
Сложение и вычитание
В микроконтроллерах PIC имеется две команды сложения.
∙ addlw
Эта команда позволяет прибавить 8-битную константу к рабочему регистру W. Например, команда addlw b’10101010’:
∙ addwf
Эта команда прибавляет переменную из памяти данных к содержимому рабочего регистра W. В отличие от команды addlw, в качестве адресата может использоваться как W, так и исходный регистр данных. Например, addwf h’26’,f:
Очистка
Как рабочий регистр, так и любой регистр данных могут быть сброшены. В обоих случаях при выполнении этой операции будет установлен флаг Z, индицирующий нулевой результат операции.
∙ clrw
Эта команда очищает рабочий регистр. По своему действию она эквивалентна команде movlw 0.
∙ clrf
С помощью этой команды можно очистить содержимое любого регистра данных. Например, clrf h’26’:
Обе команды сложения, да и вообще все команды, оперируют 8-битными операндами. Тем не менее можно обрабатывать операнды любой длины, если делать это побайтно. В случае сложения, например, нам потребуется складывать попарно соответствующие байты операндов (от младшего байта до старшего) с добавлением бита переноса, полученного при сложении n-х байтов, к (n + 1) — й сумме. Входной перенос при сложении младшего байта равен нулю, а перенос из старшего байта становится старшим битом результата. Например, h’FFFF’ + h’FF = h’100FE’ (65 535 + 255 = 65 790).
Чтобы проиллюстрировать этот процесс, напишем программу, складывающую 8-битное число с 16-битным и получающую в результате 17-битную сумму. Первое слагаемое, как показано на Рис. 5.9, размещается в двух ячейках памяти данных с адресами h’20’ (старший байт) и h’21’ (младший байт). Сумма сохраняется в трех ячейках с адресами h’30’ (старший байт), h’31’ (средний байт) и h’32’ (младший).
Pис. 5.9. Сложение 16-битного числа с 8-битным
Составим перечень задач (алгоритм), учитывая, что нам нужно реализовать этот процесс в виде последовательности операций, выполняемых 1-байтными командами:
1. Прибавить младший байт первого слагаемого к младшему байту второго слагаемого — получим младший байт суммы и бит переноса С1 (Рис. 5.10, а).
2. Прибавить бит переноса С1 к старшему как байту первого слагаемого — получим средний байт суммы и новый бит переноса С2 (Рис. 5.10, б).