INDF equ 0
; Регистр косвенной адресацииSTATUS equ 3
; Регистр STATUSFSR 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 в Wincf 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. Как можно после завершения программы определить, что это условие не было выполнено?