El programa que has puesto no funcionaría porque la instrucción "retlw " devuelve un valor grabado en la memoria de programa, y tú las variables la has guardado en la memoria de datos con la instrucción "movwf v1".
Si la tabla va a estar permanentemente grabada en ROM te aconsejo utilizar la directiva DT.
Ejemplo:
Tabla
addwf PCL,F
DT v1, v2, v3, ...
....
; Para leer la tabla:
movlw 2
call Tabla ; Leería la v2.
Si es una tabla con variables que cambian durante el programa debes guardarla en memoria de Datos RAM y te recomiento utilizar "Direccionamiento Indirecto." Por ejemplo:
Temporal EQU 0x0C
Tabla EQU 0x0D ; La tabla se guardará a partir de la posición
; 0x0D de memoria RAM de datos.
......
movf v1, W ; Para escribir la primera variable en la tabla.
call EscribirTabla
......
......
EscribirTabla ; Subrutina para escribir en tabla.
movwf Temporal
movlw Tabla
movwf FSR ; Apunta al comienzo de la tabla.
movf Temporal,W
movwf INDF ; Escribe el dato en la tabla.
incf FSR ; Apunta a la siguiente posición de la tabla.
return
etc.
Espero te sirva de ayuda.