Un buen ejemplo es la rutina de escritura en la memoria de programa del pic.Esta escritura se debe hacer en bloques de 4 bytes,y dado que las posiciones de memoria de programa son de 14 bits,para cada una de las 4 iteraciones del bucle,se escribe primero el byte menos significativo y después los 6 bits restantes:
Codigo:
INICIO BSF STATUS,6 //
BCF STATUS,5 // Banco 2
MOVF DATADDR,W // Dirección inicial de los 4 bytes de origen
MOVWF FSR // Apuntamos a dicha dirección inicial.Es en este momento cuando INDF ya contiene el dato apuntado por FSR
LOOP MOVF INDF,W
MOVWF EEDATA // Cargamos el dato en el byte menos significativo
MOVLW 0x00
MOVWF EEDATH // Deshechamos (todos a 0) los 6 bits restantes de la WORD
INCF FSR,1 // Apuntamos a la siguiente dirección de origen
BSF STATUS,5 // Banco 3
BSF EECON1,7 // Accedemos a la memoria de programa
BSF EECON1,2 // Habilitamos escritura
BCF INTCON,7 // Deshabilitamos interrupciones
MOVLW 0x55 // Secuencia de escritura
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,1
NOP
NOP
BCF EECON1,2 // Deshabilitamos escritura
BSF INTCON,7 // Habilitamos interrupciones
BCF STATUS,5 // Banco 2
INCF EEADR,1 // Incrementamos la dirección de destino...
MOVF EEADR,W
ANDLW 0x04
XORLW 0x04
BTFSS STATUS,2 // ...y comprobamos si ya se escribió todo el bloque...
GOTO LOOP // NO! Aún no se escribieron los 4 datos
Así,el direccionamiento indirecto consiste,no en acceder directamente al contenido de un registro haciendo "MOVF dato1,W",sino mediante el puntero FSR,que lo hacemos apuntar a la dirección que contiene el dato que nos interesa.
No estoy muy ducho en assembler,pero imagino que este es el mejor método para,por ejemplo,representar en un lcd una cadena de caracteres que estan guardados en memoria de forma consecutiva:
Direccionamos FSR al primer carácter,mandamos el carácter al lcd,incrementamos en 1 FSR,mandamos el siguiente carácter,y así...
Saludos