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

  • doc
  • 08.05.2020
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала 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