Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Консп лек по ЭиУА.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
934.4 Кб
Скачать

3.3 Фиксированная (абсолютная) адресация

Чтобы выполнить какие-либо действия с информацией в регистре, его имя или адрес должны быть указаны в команде. Будучи составной частью кода команды, 7-битный адрес операнда (регистра) является «фиксированным и, поэтому не может быть изменен во время выполнения программы.

Хотя явное задание этих адресов может показаться очевидным способом для указания местоположения объекта в памяти данных, существует ряд ситуаций, в которых такое указание неудобно.

В качестве примера, иллюстрирующего эту недостаточную гибкость, предло­жим, что мы хотим очистить содержимое всех регистров данных 0-го банка, т.е. регистров h'20'…h'7F'. Очевидным решением этой задачи будет многократное (96 раз) использование команды clrf (очистка регистра), как показано ниже в программе:

Clrf h’20’; очищаем регистр по адресу h’20’.

Clrf h’21’; очищаем регистр по адресу h’21’.

. . . .

Clrf h’7E’; очищаем регистр по адресу h’7E’.

Clrf h’7F’; очищаем регистр по адресу h’7F’.

Несмотря на то, что этот код вполне работоспособен, он чрезвычайно неэф­фективен. Каждая из 96 команд выполняет одну и ту же операцию, хотя и для дру­гого адреса.

4 Косвенная адресация. Логика

Цель лекции: познакомить с применением косвенной адресации, логическими функциями и маскированием.

Краткое содержание лекции. Косвенная адресация и её применение. Логические функции NOT, OR, AND, XOR их применение. Таблицы истинности логических функций.

4.1 Косвенная адресация

В любом микропроцессоре имеется одна из разновидностей косвенной адресации, при которой один или более внутренних регистров используются для хранения адреса операнда в памяти данных. Такие адресные или индексные регистры ис­пользуются в качестве указателя на данные. Основное отличие от прямой адреса­ции заключается в том, что содержимое регистра-указателя может изменяться в процессе выполнения программы. То есть искомый адрес является переменной величиной. Например, для очистки массива данных можно ис­пользовать цикл, инкрементируя в каждом проходе цикла регистр, указывающий на адрес очищаемого регистра.

В микроконтроллерах РIС реализован достаточно простой вариант такого ти­па адресации. Имеется отдельный элемент ИЛИ-НЕ, который детектирует обраще­ние по прямому 7-битному адресу b'0000000' и, просто передает на шину адреса памяти данных содержимое регистра h'04', называе­мого индексным регистром (FSR). Это происходит, если в качестве адресата ко­манды используется нулевой адрес, по которому располагается регистр косвен­ной адресации INDF. Этот регистр является виртуальным, т.е. физически не су­ществует. Он используется исключительно для передачи содержимого регистра FSR на шину.

В качестве простого примера предположим, что содержимое регистра FSR равно h'66',тогда команда clrf h’00’ (или clrf INDF) очистит регистр, располо­женный по адресу h'66’ а не по адресу h'00’. Содержимое регистра FSR можно изменить в любой момент времени, например, его можно инкрементировать в каждом проходе цикла, как в программе очистки регистров, рассмотренной ниже.

Перепишем программу очистки массива, заменив линейную структуру циклом, как показано на рисунке 4.1. Теперь наша программа будет рабо­тать по следующему алгоритму, представляющему собой перечень задач:

1 ) Установить указатель FSR на начало массива.

2) Очистить адресуемый регистр данных, указав в качестве адресата регистр данных h'00'.

3) Инкрементировать указатель FSR.

4) Проверить, не достиг ли указатель конца массива, в нашем случае — адреса h'7F'. Если нет, то перейти к пункту 2.

5) Если массив очищен, то продолжить выполнение программы.

Код, соответствующий этому алгоритму, приведен ниже в программе. Очистку регистров по-прежнему выполняет команда clrf, которая «проходит» по массиву, начинающемуся с адреса h'20’. При каждом прохо­де цикла указатель в регистре данных h'04' инкрементируется. В конце концов, со­держимое регистра FSR выйдет за границу заданного диапазона, в результате чего программа выйдет из цикла и продолжит выполнение следующей секции кода.

Clearfiles; подпрограмма очистки массива.

Movlw h’20’; помещаем начальный адрес в W.

Movwf FSR; и копируем его в FSR.

Metka Clrf INDF; очищаем регистр, на который указывает FSR.

Incf FSR, F; инкрементируем указатель на адрес следующего регистра.

Теперь проверяем, не достиг ли указатель верхней границы массива?

Movf FSR, W; копируем указатель в W.

Addlw -h’7F’; сравниваем с адресом последнего регистра.

Btfss STATUS, Z; проверяем, если флаг Zero=1, то завершаем цикл.

Goto Metka; если нет, выполняем повтор цикла.

Return; если да, завершаем цикл и выходим из подпрограммы.