Bruno, genial! Simplemente GENIAL!
Que sepas que si te pasas alguna vez por Galicia (España), o si ando por Rosario, te invito unas cervezas, que te las tienes merecidas! 
Me alegro que te pueda ayudar. Obviamente nunca rechazo unas cervezas

La verdad me ha quedado todo clarisimo!
Excepto esto: 
*El direccionamiento indirecto que funcion tiene? Si podemos leer el registro directamente, para que lo vamos a leer de manera indirecta? O es para no tener que cambiar de pagina?
Bueno, ya jacrmr ha respondido de una manera bastante peculiar y buena a tus preguntas. Yo voy a intentar hacerte ver para qué serviría en la práctica el direccionamiento indirecto.
Para poder acceder a un registro de manera indirecta, posees 2 registros:
El registro FSR, que es un registro puntero. Es decir, "apunta" o contiene el valor de la posición de memoria a la cual deseás acceder;
Y el registro INDF que contiene el valor del registro al cual FSR apunta en ese momento.
Entonces, supongamos que quiero poner a cero todas la memoria RAM comprendida entre 0x20 y 0x4F.
Si no existiera el direccionamiento indirecto, tendríamos que hacer algo así:
clrf 0x20
clrf 0x21
clrf 0x22
clrf 0x23
.....
clrf 0x4d
clrf 0x4e
clrf 0x4f
Lo que sería un verdadero despilfarro de memoria, no?
Ahora, utilizando direccionamiento indirecto, la cosa se torna más sencilla.
movlw 0x20 ;comienzo desde el registro 0x20
movwf FSR ;apunto a dicho registro(ahora, INDF contiene valor del registro 0x20. Todas las operaciones de lectura/escritura sobre el INDF afectarán al registro como si estuviese accediendo directamente a él)
prox clrf INDF ;pongo a cero la posición de memoria a la cual FSR apunta en este momento
incf FSR,F ;indico que quiero acceder a la proxima posicion de memoria
movf FSR,w ;copio el valor de FSR a W
xorlw 0x50 ;y aplico una XOR para ver si ya he terminado con todos los registros que deseaba limpiar
btfss STATUS,Z ;si se cumple, he terminado
goto prox ;no, entonces próximo registro
nop ;listo!
Si uso direccionamiento indirecto, en FSR tengo el PORTA por ej, cuando cambie el PORTA, tambien cambiara FSR?
Bueno, supongamos que "en FSR tengo el PORTA": Esto es lo mísmo que decir(en esta familia de PICs) que FSR = 0x05. O sea, que en el registro FSR has cargado el valor 0x05 que corresponde al PORTA. Ahora, si cambiás el valor del PORTA, también cambiará el valor contenido en el registro INDF. No el FSR. El FSR sólo indica el registro al cual acceder. INDF es el que contiene el valor del PORTA, y cambiará si PORTA cambia y viceversa(cambiar el valor del INDF también cambiará el valor del registro 0x05(PORTA)).
¿Se entendió?
Vamos con un ejemplo:
;Supongo que configuré a PORTB todo como salidas y ahora:
clrf PORTB ;ahora, PORTB=0
movlw 0x06 ;cargo en W la dirección del PORTB(podría haber hecho movlw PORTB)
movwf FSR ;ahora, copio el valor de W en el registro FSR. Como W vale 0x06, al cargarlo en el FSR ahora estoy accediendo indirectamente al PORTB.
bsf INDF,0 ;ahora, indico que pongo a uno el bit0 del registro INDF. Como INDF contiene el valor del registro PORTB porque FSR apunta a el, ahora el registro PORTB también valdrá 0x01
clrf PORTB ;vuelvo a limpiar el registro PORTB, por lo que INDF también ahora se verá afectado y valdrá 0x00
Es decir que ambos se afectan mutuamente y se comportan como uno sólo(en realidad lo son

)
Por cierto, cuando tengo que cambiar de pagina? Si estoy en el banco 0, y quiero leer o escribir algo del banco 1 primero tengo que cambiar de pagina? En la pregunta siguiente la instruccion MOVLW lee PIE1 del banco 1, estando en el banco 0 ¿?
Bueno. Esto tiene que ver con la arquitectura de esta familia de microcontroladores. El direccionamiento indirecto posee una ventaja frente al directo. El directo está dividido en bancos de 128 registros cada uno. Esto es por un tema un poco más profundo que no quiero explayar para no marearte.
Lo importante es que mediante el direccionamiento indirecto, podes acceder a cualquiera de los primeros 256 registros sin tener que cambiarlo de banco. Si necesitás acceder a un registro más allá del 0xFF mediante direccionamiento indirecto entonces necesitás setear el bit IRP que mencionaste anteriormente y en este uC no tiene sentido por lo que ya mencionamos.
En definitiva, en este uC que estás usando, podés acceder a toda la RAM sin necesidad de tener precauciones de cambio de banco siempre y cuando lo hagas mediante direccionamiento indirecto. Si usás direccionamento directo, que es más común, necesitás asegurarte que el uC se encuentre en el banco correcto antes de trabajar sobre dicho registro.
Si mirás en las intrucciones en el datasheet vas a ver que en las instrucciones movf, movwf,xorwf, y muchas otras, el registro f debe estar entre 0 y 127. Es decir que cada una de esas instrucciones sólo pueden contener 7bits de direccionamiento. Los otros dos bits(de mayor peso) son dados mediante los bits RP1 y RP0.
Resumiendo:
Si quisiese acceder a PIE1 mediante direccionamiento indirecto sólo me bastaría con hacer:
movlw PIE1
movwf FSR
clrf INDF ;y aqui leer o escribir directamente el registro INDF
en cambio, si quisiese acceder mediante direccionamiento directo y estuviese en el banco 0:
bsf STATUS,RP0 ;cambio al banco1
clrf PIE1 ;y ahora si podría trabajar sobre el registro
La instrucción MOVLW sirve para cargar un LITERAL, es decir un valor pre-establecido. No permite cargar un valor no estático y el contenido de STATUS siempre varía. El movlw carga siempre un valor que tú eliges a la hora de programación. No se puede modificar el valor a cargar en W utilizando la movlw durante la ejecución en el pic(deberías sobrescribir la flash).
Si te fijas, en la linea 21:
021 308C MOVLW PIE1 ;(Cargo en W la dirección a la cual quiero acceder de manera indirecta...es decir, 0x8C)
Aqui estamos cargando en W un valor que no es un "literal". PIE1 se puede modificar en ejecucion o no?
Bueno, esto genera siempre mucha confusión. jacrmr te lo ha explicado más que suficientemente bien.
PIE1 se puede modificar en ejecución. Pero no confundamos el contenido del registro PIE1(que es el que puede cambiar en ejecución) con la dirección en la que se encuentra el registro PIE1(que no cambia).
Hacer MOVLW PIE1 es exáctamente lo mísmo que hacer movlw 0x0C. Porque como el MPASM espera un literal, un valor incambiable, lo buscará en la definición que hayas hecho de PIE1, y si lo buscas dentro del archivo include(.inc) verás que PIE1 ha sido definido como 0x0C. El ensamblador asume que su valor es 0x0C y lo toma.
Esto permite un código un poco más legible. Obviamente todo depende de la instrucción. Esto se usa mucho en las que aceptan literales como argumentos.
Saludos!