Косвенная адресация, регистра INDF и FSR
Косвенная адресация - режим адресации памяти данных, когда адрес регистра не включается в код команды.
Регистр FSR, используется как указатель ячейки в памяти программ, которая должна быть прочитана или в которую должно быть записано новое значение.
Указатель размещается в памяти данных, поэтому может быть изменен программным способом.
Этот метод адресации может быть полезен для операции с таблицами, размешенными в памяти данных.
Косвенная адресация возможна при использовании одного из регистров INDF. Любая команда, использующая регистр INDF фактически обращается к регистру, указанному в FSR. Косвенное чтение регистра INDF будет давать результат 00h. Косвенная запись в регистр INDF не вызовет никаких действий. Регистр FSR содержит 12-разрядный адрес ячейки в памяти данных. Регистр INDFn - не физический регистр. Обращение к регистру INDFn фактически вызовет действие с регистром, адрес которого указан в FSRN (принцип косвенной адресации).
В микроконтроллерах РIС18FХХ2 реализовано три 12-разрядных регистра косвенной адресации, для обращения ко всей области памяти данных (4096 байт):
• FSR0 состоит из FSR0Н: FSR0L
• FSR1 состоит из FSR1Н: FSR1L
• FSR2 состоит из FSR2Н: FSR2L
Дополнительно есть регистры INDFO, INDF1 и INDF2, которые физически не реализованы.
Обращение к этим регистрам фактически вызовет действие с регистром, адрес которого указан в FSR.
Если команда выполняет запись в регистр INDFO, то данные будут записаны в регистр, адрес которого указан в FSR0Н: FSR0L.
Чтение регистра INDF1 возвратит значение регистра, адрес которого указан в FSR1Н: FSR1L.
Регистры INDFn могут использоваться как операнды команд.
Если INDFO, INDF1, INDF2 читаются косвенно через FSR, то чтение будет давать результат '0'.
Операция косвенной записи в регистры INDFO, INDF1, INDF2 будет эквивалентна команде NOP, и на биты регистра STATUS влияния не окажет.
Операция косвенной адресации
Каждому регистру FSR соответствует регистр INDF, плюс еще четыре дополнительных регистра, которые определяют, как изменится FSR при выполнении косвенной адресации:
• При косвенной адресации регистр FSRn не изменяется (обращение к INDFn)
• Автодекремент FSRn после косвенной адресации (обращение к POSTDECn)
• Автодекремент FSRn после косвенной адресации (обращение к POSTINCn)
• АвтодекрементFSRn перед косвенной адресацией(обращение к PREINCn)
Значение в регистре WREG используется как смешение к FSRn. После косвенной адресации значение WREG и FSR не изменяется (обращение к PLUSWn).
Состояние FSR не отображается в регистре STATUS при использовании автоинкремента или декремента при косвенной адресации. Например, если значение в FSR становиться равным ‘0’, то бит 7 не будет установлен в ‘1’.
Инкремент и декремент FSR затрагивает все 12 разрядов адреса. Например, переполнение FSRnL вызовет автоматическое увеличение FSRnН. Эти особенности позволяют использовать FSRn как указатель программного стека, в дополнение к операциям с таблицами в памяти данных.
Обращение к PLUSWn позволяет реализовать индексированную косвенную адресацию. К регистру FSR добавляется значение регистра WREG, чтобы сформировать адрес ячейки. Значение регистра при этом не изменяется.
Если регистр FSR содержит значение, которое указывает на один из регистров INDFn, косвенной чтение будет давать результат ‘0’, а запись эквивалентна команде NOР (биты регистра STATUS изменяются).
Если адресатом при косвенной адресации являются регистры FSRnН или FSRnL, то операция записи имеет более высокий приоритет, чем автоинкремент и автодекремент.
Механизм косвенной адресации