INDF equ 0; Регистр косвенной адресации
STATUS equ 3; Регистр STATUS
FSR equ 4; Индексный регистр
TEMP_0 equ h’30’; Начальный элемент массива
SUM equ h’48’ ; Общая сумма накапливается в регистрах h’48’:h’49’
AVERAGE equ h’4A’; Среднее
Z equ 2; Флаг нуля — 2-й бит регистра STATUS
С equ 0 ; Флаг переноса — 0-й бит регистра STATUS
; Задача 1: Обнулить общую сумму и среднее
AV_DAILY clrf SUM; Обнуляем старший байт суммы
clrf SUM+1; Обнуляем младший байт суммы
; Задача 2: Установить указатель на Temp[0]
movlw ТЕМР_0; Помещаем адрес первого элемента массива
movwf FSR; в регистр указателя
; Задача 3: Основной цикл
; Задача 3,а: Прибавить Temp[i] к 2-байтной сумме
LOOP1 movf INDF,w; Считываем Temp[i]
addwf SUM+1,f; Добавляем к младшему байту суммы
btfsc STATUS,С; ЕСЛИ нет переноса, ТО не инкрементируем старший байт
incf SUM,f; ИНАЧЕ учитываем перенос
; Задача 3,б: Инкрементирование i
NEXT incf FSR,f; i++
;Задача 3,в: Повторять вычисления, пока i < 24
movf FSR,w; Считываем значение указателя
sublw TEMP_0+h’18’; Вычитаем адрес конечного элемента массива (Теmр[24])
btfss STATUS,Z; ЕСЛИ равно, то выходим из цикла
goto LOOP1; ИНАЧЕ повторяем
; Задача 4: Разделить на 24 для получения среднего
clrf AVERAGE; Обнуляем регистр среднего
; Вычитаем 24 и накапливаем количество вычитаний до формирования бита заема
LOOP2 movlw d’24’; Заносим константу 24 в W
incf AVERAGE,f; Запоминаем очередную операцию вычитания
subwf SUM+1,f;Вычитаем 24 из младшего байта суммы
btfsc STATUS,C; ЕСЛИ заем, ТО переходим к старшему байту
goto LOOP2; ИНАЧЕ повторяем вычитание
movlw 1; Вычитаем единицу из старшего байта
subwf SUM,f
btfsc STATUS,С; ЕСЛИ заем (С==0), ТО выходим из цикла
goto LOOP2; ИНАЧЕ повторяем вычитание
decf AVERAGE,f; Компенсируем лишнюю операцию вычитания
... ...; Следующая процедура
5.1. Можете ли вы сказать, какую операцию выполняют следующие команды над байтом данных, находящимся в рабочем регистре W?
addwf FILE,w
subwf FILE,w
5.2. Как можно проще всего с помощью одной команды поменять значение 0-го бита любого регистра данных? Допускается затрагивать и другие биты.
5.3. Напишите программу, которая складывает два 16-битных числа, получая 17-битную сумму. Первое слагаемое размещается в регистрах памяти данных h’20’ (старший байт) и h’21’ (младший байт). Второе слагаемое размещается в регистрах h’22’ (старший байт) и h’23’ (младший байт). Сумма запоминается в трех регистрах: h’24’ (старший байт), h’25’ (средний байт) и h’26’ (младший байт).
5.4. Напишите программу для вычитания двухбайтного числа NUM_2, находящегося в регистрах h’22’:h’23’, из числа NUM_1, находящегося в регистрах h’20’:h’21’. Двухбайтная разность должна запоминаться в регистрах h’24’:h’25’. Не забудьте, что в случае возникновения заема при вычитании младших байтов, необходимо при вычитании старших байтов дополнительно вычесть единицу из NUM_1. Считается, что NUM_2 меньше или равно NUM_1. Как можно после завершения программы определить, что это условие не было выполнено?