Post resgatado do ASM51 antigo:
O objetivo do endereçamento indireto é permitir o acesso mais veloz ao conteúdo da memória RAM do MCU. É claro que isto vale para posições contíguas e lineares de memória.
Veja que o conjunto de instruções dos PICs prevê o acesso direto aos registradores (RAM). Isto porque, quando você executa uma instrução como por exemplo: MOVWF REG, o processador na realidade irá receber um código binário (opcode) composto do código da instrução e o endereço do registrador REG.
A princípio, esta arquitetura não apresenta quaisquer problemas, mas em alguns tipos de aplicação, pode ser necessário movimentar ou analisar uma grande quantidade de dados residentes nos registradores (GPR, localizados na memória de dados - RAM).
Se você utilizar a abordagem do acesso direto, terá de escrever um comando para cada endereço de memória a ser movimentado/analisado. Isto porque você não pode alterar o código da instrução para fazer com que a mesma aponte para o endereço seguinte de memória.
Imagine que você possua um código ou senha armazenado em 5 posições da memória RAM. Para analisar este código/senha utilizando o acesso direto, você faria algo como:
REG1 EQU 0x20
...
MOVF REG1,W
CALL PROCESSA
MOVF REG1+1,W
CALL PROCESSA
MOVF REG1+2,W
CALL PROCESSA
MOVF REG1+3,W
CALL PROCESSA
MOVF REG1+4,W
CALL PROCESSA
...
Quanto maior a senha, mais instruções serão necessárias ... Imagine fazer um datalogger dessa forma !!!!!
Para otimizar operações como a descrita acima, utiliza-se então o acesso indireto à memória.
Para viabilizar esta operação, a Microchip utiliza (na arquitetura 16) dois registradores especiais : o FSR e o INDF.
O primeiro atua como um ponteiro, ou indicador, ou seja, o seu conteúdo indica a posição de memória a ser acessada.
O segundo registrador, é utilizado para o acesso (de leitura ou escrita) à posição de memória indicada pelo FSR.
Existe ainda o bit IRP, no registrador STATUS, utilizado para especificar se o acesso indireto se fará no primeiro ou no segundo bloco de 256 endereços da RAM (lembre-se que a série 16 pode endereçar até 512 bytes de RAM). Podemos considerar o bit IRP como o nono bit do registrador FSR.
Exemplo de acesso indireto: copiar o valor 01 para os registradores PORTA e PORTB:
MOVLW 0x05 ; endereço do PORTA
MOVWF FSR ; copia o endereço do PORTA para o FSR
MOVLW 1
MOVWF INDF
INCF FSR,F
MOVWF INDF
Entendeu ?
Assim, reescrevendo o programa para analisar o código/senha acima teríamos:
REG EQU 0x20
CONTA EQU 0x30
TAM EQU 5
...
MOVLW TAM
MOVWF CONTA
MOVLW REG
DE_NOVO:
MOVWF FSR
MOVF INDF,W
CALL PROCESSA
INCF FSR,F
DECFSZ CONTA,F
GOTO DE_NOVO
...
Observe que agora, se quisermos aumentar o tamanho da senha, basta alterar o valor de TAM (até o limite de 255).
Outro detalhe importante: na série 16, o acesso à memória é prejudicado devido ao fato de que os GPRs não estão colocados em uma região contígua de memória, já que no início de cada banco, temos os SFR.
É isso, espero que ajude.
O meu livro Microcontroladores PIC: Técnicas Avançadas, traz alguns exemplos sobre o acesso indireto a memória dos PICs.
Até +