Segun tengo entendido, la directiva DB (Define Byte) sirve para asignar un nombre a una localidad de memoria, es como para crear tus propios registros, particularmente yo prefiero el Cblock.
Lo de crear tablas con los pic16fxxx es muy sencillo, utiliza la directiva "dt" (Define table) lo cual crea automaticamente una estructura como la mensionada por fer_zone, es decir, le incluye los RETLW, asi puedes definir tu mensaje muy comodamente:
dt "Hola mundo"
en este archivo hay un ejemplo muy bueno, es para un lcd, pero con una pequeña modificacion se puede usar para enviar datos por puerto serie, enviando los datos al registro TXREG.
PD: Este codigo no es mio, lo saque no recuerdo de donde, asi que lo copio tal cual.
;ejem_lcd_2.asm
;
;Realizado por A. Marin
;
;Programa para manejar la pantalla del LCD. Pone en la misma en peridos de 2 Sgd.
;las palabras Blanco/Negro
;
;Vamos a utilizar la instruccion de ensamblador "dt" (define table). Con esta orden
;se facilita la realizacion de tablas. Ver el archivo "Instruccion Dt"
;
;
List p=16F84a ;Tipo de procesador
include "P16F84a.INC" ;Programa de Microchip
Lcd_var equ 0x0c ;Variables (2) de las rutinas de manejo del LCD
Contador equ 0x0e ;Variable para la temporizaci©n
Temp_1 equ 0x0f ;Variable temporal
Temp_2 equ 0x10 ;Variable temporal
org 0x00 ;Vector de Reset
goto Inicio
org 0x05 ;Salva vector de interrupci©n
include "lcd_amr.inc" ;Incluye las rutinas del LCD
;--------------------------
;Mensajes a visualizar
;--------------------------
Mensa_jes movwf PCL ;Control de desplazamiento sobre la tabla
Mensa_1 equ $
dt "BLANCO",0X00 ;El codigo 0x00 determina que es el ultimo dato
;de mensa_1
Mensa_2 equ $
dt "NEGRO",0X00
;--------------------------
;Control de tiempo. Periodos de 50 mS por valor en Segun_dos
;--------------------------
Tiem_po bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw b"00111100" ;60 ----->W
movwf TMR0 ;TMR0=255-60=195
clrwdt ;limpia WDT
Bucle btfss INTCON,T0IF ;Cumpueva si flag de rebosamiento cambia
goto Bucle
decfsz Contador,1 ;Va reduciendo la variable por cada paso
goto Tiem_po ;Vuelve a la rutina de Tiem_po
return
;--------------------------
;Rutina de visualizacion en el LCD
;--------------------------
Mensaje movwf Temp_1 ;Salva posicion de la tabla
Mensaje_1 movf Temp_1,W ;Recupera posicion de la tabla
call Mensa_jes ;Busca caracter de salida
movwf Temp_2 ;Guarda el caracter
movf Temp_2,F
btfss STATUS,Z ;Mira si es el ultimo
goto No_es_ultimo
return
No_es_ultimo call LCD_DATO ;Visualiza en el LCD
incf Temp_1,F ;Siguiente caracter
goto Mensaje_1
;--------------------------
;Inicio general del programa
;--------------------------
Inicio clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b"00011000"
movwf TRISA ;RA0-RA2 salidas, RA3-RA4 entradas
movlw b"00000111"
movwf OPTION_REG ;Preescaler de 256 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0
call LCD_INI ;Secuencia de inicio del LCD
movlw b"00001100"
call LCD_REG ;Envia instruccion a modo LCD
Loop movlw b"00000001"
call LCD_REG ;Borra LCD y Cursor a Inicio
movlw Mensa_1
call Mensaje ;Visualiza el mensaje 0
movlw .20
movwf Contador ;Carga registro bucles con 20
call Tiem_po ;Temporiza 2 segundos
movlw b"00000001"
call LCD_REG ;Borra LCD y Cursor a Inicio
movlw Mensa_2
call Mensaje ;Visualiza el mensaje 1
movlw .20
movwf Contador
call Tiem_po ;Temporiza 2 segundos
goto Loop
end ;Fin del programa fuente