ИСПОЛЬЗОВАНИЕ КОСВЕННОЙ АДРЕСАЦИИ ДЛЯ ОБРАБОТКИ МАССИВОВ ИНФОРМАЦИИ
Оценка 4.8

ИСПОЛЬЗОВАНИЕ КОСВЕННОЙ АДРЕСАЦИИ ДЛЯ ОБРАБОТКИ МАССИВОВ ИНФОРМАЦИИ

Оценка 4.8
doc
08.05.2020
ИСПОЛЬЗОВАНИЕ КОСВЕННОЙ АДРЕСАЦИИ ДЛЯ ОБРАБОТКИ МАССИВОВ ИНФОРМАЦИИ
14. ИСПОЛЬЗОВАНИЕ КОСВЕННОЙ АДРЕСАЦИИ ДЛЯ ОБРАБОТКИ МАССИВОВ ИНФОРМАЦИИ.doc

ЛАБОРАТОРНАЯ РАБОТА № 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, помещаем IndfMax

 

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

ЛАБОРАТОРНАЯ РАБОТА № 5 . Тема:

ЛАБОРАТОРНАЯ РАБОТА № 5 . Тема:

Например, если в регистре FSR содержится адрес 0х0С, то содержимым регистра

Например, если в регистре FSR содержится адрес 0х0С, то содержимым регистра

Movwf Count ; Count – счетчик ;цикла

Movwf Count ; Count – счетчик ;цикла

Indf,0 ; вычитаем Pred из

Indf,0 ; вычитаем Pred из

После завершения приема последовательности сформировать и отправить на порт

После завершения приема последовательности сформировать и отправить на порт

Сумму элементов в диапазоне от 10 до 45 21 0 3 0xef 0x24

Сумму элементов в диапазоне от 10 до 45 21 0 3 0xef 0x24
Скачать файл