Supongamos que tenemos la función Tabla. La llamamos desde nuestro programa con call Tabla.
Tabla
addwf PCL,F
retlw 0 ;Aquí apunta el PCL si W vale 0
retlw 1 ;Aquí apunta el PCL si W vale 1
retlw 2 ;Aquí apunta el PCL si W vale 2
Para no entrar en determinados detalles digamos lo siguiente:
PCL contiene la posición de memoria de la siguiente instrucción a realizar. (Esto no es del todo cierto, ya que el que contiene la dirección es el PC, Program Counter)
Si ejecutamos cualquier instrucción (que no sea un call o un goto), luego de ejecutada la instrucción el PCL se incrementa en 1.
Cuando llamamos a la función Tabla, PCL apunta a la línea "addwf PCL,F".
Luego de ejecutarse esa instrucción, PCL contiene una nueva dirección a la cual va a saltar nuestro programa.
Como nuestra instrucción era sumar W al propio PCL, la nueva dirección apuntada por el PCL estará determinada por W.
Así, si W es 0 la instrucción que se va a ejecutar es la inmediatamente siguiente a "addwf PCL,F". Si W es 2 la instrucción que se va a ejecutar es la siguiente a ("addwf PCL,F" + 2)