ЛАБОРАТОРНАЯ РАБОТА № 5.
Тема: ИСПОЛЬЗОВАНИЕ КОСВЕННОЙ АДРЕСАЦИИ ДЛЯ ОБРАБОТКИ МАССИВОВ ИНФОРМАЦИИ
Цель: Получение практических навыков обработки массивов информации.
1.1 Краткие сведения из теории
Различают прямую и косвенную адресацию.
Адресация называется прямой, если в команде явно указан адрес операнда. Например, в команде MOVWF 0x0C явно указан адрес регистра 0x0C, в который нужно переслать содержимое аккумулятора.
Использование прямой адресации не всегда бывает удобным, например, в случае выполнения одинаковых операций над группой регистров. Так, если нам необходимо очистить содержимое 20 соседних регистров, нам нужно 20 раз повторить команду очистки для регистров с разными адресами. Эти действия удобно было бы выполнять в цикле, но тогда в цикле нужно увеличивать на единицу адрес регистра, что невозможно сделать при прямой адресации.
Поэтому в таких случаях используют не прямую, а косвенную адресацию.
Адресация называется косвенной, если для обращения к регистру используется указатель – регистр, содержащий его адрес.
В контроллерах серии PIC для реализации косвенной адресации используются регистры с адресом FSR 0х04 и INDF с адресом 0х00.
Регистр INDF – физически не существующий регистр, содержимым которого является содержимое того регистра, адрес которого содержится в FSR, то есть этому регистру «присваивается» имя INDF.
Например, если в регистре FSR содержится адрес 0х0С, то содержимым регистра INDF является содержимое регистра 0х0С, и любые изменения регистра INDF реально производятся с регистром 0х0С.
Таким образом, увеличивая в цикле значение регистра FSR на единицу, мы будем получать доступ к содержимому следующего регистра через FSR.
1.2 Примеры использования косвенной адресации
Пример 1
Очистить содержимое 20 регистров, начиная с адреса 0х0Е.
Решение
|
Movlw |
.20 |
; готовим цикл |
|
Movwf |
0x0c |
; из 20 шагов 0х0с – счетчик цикла |
|
Movlw |
0x0e |
; записываем адрес 0x0e |
|
Movwf |
Fsr |
; в регистр Fsr |
L0 |
clrf |
indf |
; очищаем содержимое ячейки, адрес ; которой в Fsr |
|
Incf |
Fsr, 1 |
; увеличиваем значение Fsr на 1 |
|
Decfsz |
0x0c,1 |
; отсчитываем шаг цикла |
|
goto |
L0 |
; если еще не 0, повторяем |
Пример 2
В ячейках, начиная с адреса 0х10, записано 30 значений напряжения. Выдать на порт А максимальное значение среди этих 30.
Решение
|
Movf |
0x10,0 |
; Записываем содержимое ячейки ;0х10 |
|
Movwf |
Max |
; в Max |
|
Movlw |
0x11 |
; записываем адрес 0х11 |
|
Movwf |
Fsr |
; в Fsr |
|
Movlw |
.29 |
; готовим цикл из 29 шагов |
|
Movwf |
Count |
; Count – счетчик ;цикла |
L0 |
Movf |
Indf,0 |
; загружаем содержимое ячейки, на которую указывает Fsr, в аккумулятор |
|
Subwf |
Max,0 |
; вычитаем ее из Max |
|
Movf |
Indf,0 |
; помещаем Indf в аккумулятор |
|
Btfss |
Status,c |
; проверяем флаг C. Если C >1, то ;результат больше либо равен 0, ;следовательно Мах больше Indf, ;пропускаем следующую команду. |
|
Movwf |
Max |
; если С=0, то результат отрицательный, Indf больше Max, помещаем Indf ;в Max |
|
Incf |
Fsr,1 |
; увеличиваем значение Fsr на 1 |
|
Decfsz |
Count,1 |
; отсчитываем шаг цикла |
|
Goto |
L0 |
; если не 0, то повторяем цикл |
|
Movf |
Max,0 |
; отправляем значение Max |
|
Movwf |
Porta |
; на Porta |
Пример 3
В ячейках, начиная с адреса 0х10, записано 30 значений напряжения. Выдать на порт А максимальное значение перепада напряжения с меньшего на большее.
Решение
|
Clrf |
Max |
; чистим Max |
|
Movf |
0x10,0 |
; cодержимое ячейки 0х10 |
|
Movwf |
Pred |
; помещаем в Pred |
|
Movlw |
0x11 |
; записываем адрес 0х11 |
|
Movwf |
Fsr |
; в Fsr |
|
Movlw |
.29 |
; готовим цикл из 29 шагов |
|
Movwf |
Count |
; Count – счетчик ;цикла |
L0 |
Movf |
Pred,0 |
; помещаем Pred в аккумулятор |
|
subwf |
Indf,0 |
; вычитаем Pred из Indf |
|
Btfss |
Status,c |
; проверяем флаг С |
|
Goto |
End_cycle |
; если С = 0, то перепад с большего на меньшее, уходим на конец цикла |
|
Movwf |
Temp |
; если С = 1, то перепад с меньше ; го на большее, сохраняем результат в Temp |
|
Subwf |
Max,0 |
; вычитаем Temp из Max |
|
Movf |
Temp,0 |
; помещаем Temp в аккумулятор |
|
Btfss |
Status,c |
; проверяем флаг С. Если С = 1, ; то перепад меньше Max, ухо;дим на конец цикла |
|
Movwf |
Max |
;если С = 0, то перепад больше ; Max, запоминаем его в Max |
End_cycle |
Movf |
Indf,0 |
; помещаем Indf |
|
Movwf |
Pred |
; в Pred |
|
Incf |
Fsr,1 |
; увеличиваем значение Fsr на 1 |
|
Decfsz |
Count,1 |
; отсчитываем шаг цикла |
|
Goto |
L0 |
; если цикл не закончился, воз- ; вращаемся на начало |
|
Movf |
Max,0 |
; отправляем значение Max |
|
Movwf |
Porta |
; на Porta |
1.3 Задание на лабораторную работу № 5
На бит n порта A поступает последовательность байтов данных в последовательном коде. Синхронизирующий сигнал передается по биту m порта A. Последовательность заканчивается числом z (это число является признаком окончания последовательности и в ячейку не записывается). Записывать получаемую последовательность в ячейки, начиная с адреса а. После завершения приема последовательности сформировать и отправить на порт В сообщение s.
1.4 Варианты заданий
№ |
n |
m |
z |
a |
s |
1 |
0 |
1 |
0x00 |
0x10 |
Количество элементов, больших 9 |
2 |
0 |
2 |
0xff |
0x11 |
Количество элементов в диапазоне от 3 до 15 |
3 |
1 |
0 |
0xfe |
0x12 |
Количество элементов, меньших 0 |
4 |
1 |
2 |
0xfd |
0x13 |
Значение максимального элемента |
5 |
1 |
3 |
0xfc |
0x14 |
Значение минимального элемента |
6 |
3 |
4 |
0xfb |
0x15 |
Разница между максимальным и минимальным элементом |
7 |
3 |
2 |
0xfa |
0x16 |
Адрес максимального элемента |
8 |
3 |
0 |
0xf9 |
0x17 |
Адрес минимального элемента |
9 |
0 |
3 |
0xf8 |
0x18 |
Количество перепадов с меньшего на большее |
10 |
0 |
4 |
0xf7 |
0x19 |
Количество перепадов с большего на меньшее |
11 |
1 |
4 |
0xf6 |
0x1a |
Количество перепадов, превышающих по модулю 10 |
12 |
2 |
0 |
0xf5 |
0x1b |
Количество перепадов с меньшего на большее, превышающих 20 |
13 |
2 |
1 |
0xf4 |
0x1c |
Количество перепадов с большего на меньшее, превышающих 12 |
14 |
2 |
3 |
0xf3 |
0x1d |
Количество элементов последовательности, стоящих до минимального значения |
15 |
2 |
4 |
0xf2 |
0x1e |
Количество элементов последовательности, стоящих до максимального значения |
16 |
4 |
0 |
0xf1 |
0x1f |
Количество нулевых элементов |
17 |
4 |
1 |
0xf0 |
0x20 |
Количество ненулевых элементов |
18 |
4 |
2 |
0xe0 |
0x21 |
Сумму элементов, не совпадающих с максимальным |
19 |
4 |
3 |
0xe1 |
0x22 |
Сумму элементов, не совпадающих с минимальным |
20 |
3 |
1 |
0xe2 |
0x23 |
Сумму элементов в диапазоне от 10 до 45 |
21 |
0 |
3 |
0xef |
0x24 |
Сумму элементов, меньших 6 |
22 |
1 |
4 |
0xee |
0x25 |
Сумму отрицательных элементов |
23 |
2 |
3 |
0xea |
0x26 |
Сумму неотрицательных элементов |
24 |
1 |
3 |
0xec |
0x27 |
Количество элементов, находящихся между максимальным и минимальным |
26 |
4 |
0 |
0xed |
0x28 |
Количество элементов последовательности, стоящих после минимального значения |
26 |
1 |
3 |
0xff |
0x29 |
Количество элементов последовательности, стоящих после максимального значения |
27 |
1 |
2 |
0x00 |
0x2a |
Адрес первого ненулевого элемента |
28 |
2 |
1 |
0хаа |
0х10 |
Адрес последнего ненулевого элемента |
Скачано с www.znanio.ru
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.