Рассмотрим в качестве примера два массива по восемь байтов, обозначенных метками NUM1 и NUM2 (см. Рис. 16.5,
Рис. 16.5.
; **********************
; ФУНКЦИЯ: Перемножает NUM1[8] х NUM2[8] = NUM3[16]
; ВХОД: Глобальные массивы NUM1[8], NUM2[8]
; ВЫХОД: Глобальный массив NUM3[16]
; **********************
ARRAY_MUL lfsr 0,NUM1+7; Указываем на последний элемент NUM1
Ifsr 1,NUM2+7; Указываем на последний элемент NUM2
lfsr 2,NUM3+d’15’; Указываем на младший байт последнего элемента NUM3
movlw 8; Инициализируем счетчик цикла
movwf COUNT
M_LOOP movf POSTDECO,w; Берем NUM1[n]
mulwf POSTDEC1; Умножаем на NUM2[n]
movlw -8; Задаем смещение для обращения к старшим байтам NUM3
movf f PRODH,PLUSW2; Сохраняем старший байт произведения
movf f PRODL,POSTDEC2; Сохраняем младший байт произведения
decfsz COUNT,f; Возвращаемся к началу цикла
goto MLOOP
return
Основной в программе является команда mulwf. Эта команда формирует в регистрах специального назначения PRODH: PRODL 16-битное произведение, получаемое перемножением содержимого рабочего регистра и заданного регистра данных. Режим косвенной адресации с постдекрементом используется как для пересылки первого сомножителя в рабочий регистр, так и для указания второго сомножителя.
Для копирования содержимого регистра PRODL в младший байт текущего элемента массива NUM3[], а регистра PRODH — в старший байт, в программе используется команда movff, осуществляющая пересылку между двумя регистрами данных. Эта команда, занимающая два слова памяти программ (см. стр. 589), использует для идентификации регистра-источника и регистра-приемника 12-битные адреса, что позволяет ей обращаться к любой ячейке памяти данных, не используя механизм банков. Сначала содержимое PRODH копируется в старший байт элемента массива с использованием режима относительной косвенной адресации. Поскольку в рабочий регистр было предварительно записано число -8 (h’F8’), содержимое регистра PRODH будет скопировано в регистр, адрес которого на 8 меньше адреса, находящегося в регистре FSR2. А содержимое регистра PRODL копируется в младший байт элемента массива, адресуемый регистром FSR2, с использованием режима косвенной адресации с постдекрементом.
Вообще говоря, модули периферийных устройств в рассматриваемых моделях практически ничем не отличаются от аналогичных модулей, имеющихся в микроконтроллерах среднего уровня. Укажем основные отличия.
Параллельные порты