Adressage indirect :
Registres FSR et INDF
Ce registre est également accessible en banque 1 (à l'adresse 0x84).
Ce registre contient une adresse (de la mémoire des données).
On dit que FSR est un "pointeur".
INDF n'est pas un registre physique.
-> Exemple n°1 : lecture du port B
Intéressons-nous au registre PORTB (adresse 0x06 de la mémoire des données).
Supposons que le contenu de ce registre est B'10001111'.
movf PORTB, W ; lecture du port B : B'10001111' est chargé dans l'accumulateur
Le même résultat est obtenu par adressage indirect, de la manière suivante :
movlw H'06' ; on charge 0x06 dans l'accumulateur
movwf FSR ; on charge 0x06 (= adresse du registre PORTB) dans le registre FSR
movf INDF, W ; lecture du port B : B'10001111' est chargé dans l'accumulateur
-> Exemple n°2 : écriture du port B
movlw B'00111100' ; B'00111100' est chargé dans l'accumulateur
movwf PORTB ; Ecriture du port B : B'00111100' est chargé dans le port B
La même chose par adressage indirect :
movlw H'06' ; on charge 0x06 dans l'accumulateur
movwf FSR ; on charge 0x06 (= adresse du registre PORTB) dans le registre FSR
movlw B'00111100' ; B'00111100' est chargé dans l'accumulateur
movwf INDF ; Ecriture du port B : B'00111100' est chargé dans le port B
-> Exemple n°3 : Effacement de la mémoire RAM du PIC 16F84A
En pratique, il n'est pas judicieux d'utiliser l'adressage indirect dans les examples 1 et 2.
Voici un example où l'usage de l'adressage indirect est très efficace (pour optimiser la taille du programme) :
Il s'agit d'effacer les 68 octets d'usage général de la mémoire RAM, situés aux adresses 0x0C à 0x4F :
movlw 0x0C
movwf FSR ; on charge l'adresse de début (0x0C)
debut
clrf INDF ; effacement du contenu du registre pointé par FSR
incf FSR, f ; on incrémente l'adresse
movlw 0x50 ; adresse de fin + 1 (0x50)
subwf FSR, W
btfss STATUS, Z ; on teste si (FSR) = 0x50
goto debut ; non : on recommence
suite
...
soit seulement 8 instructions (et 477 cycles).
N.B.
Par adressage direct, il faut aligner 68 instructions, ce qui est gourmand en mémoire de programme.
clrf 0x0C
clrf 0x0D
...
clrf 0x4F
Par contre, l'exécution demande seulement 68 cycles (optimisation de la vitesse d'exécution).