A lo mejor te sirve esto. sirva. Lo he copiado de www.pic16f84a.com, donde también he encontrado ejercicios de aplicación que tal vez te puedan servir de ayuda.
Codigo:
; Subrutinas "Arit_BCD_Bin_16Bit" ------------------------------------------------------
;
; Realiza la conversión de un número decimal de 5 digitos a binario natural de 16 bits.
; El máximo número a convertir será pues el b"1111111111111111"=0xFFFF=d"65535"
;
; El metodo usado para la conversión de un número BCD a binario natural, se basa en que
; cada dígito de un número codificado en BCD tiene un peso igual a la potencia de diez
; asociada a su posición. Para convertir el número BCD a su equivalente binario sólo es
; necesario multiplicar cada dígito BCD por su peso correspondiente y luego sumar todos
; los productos parciales obtenidos, el resultado es el número binario natural buscado.
; Es decir el valor de un número BCD de 5 dígitos se puede expresar como:
;
; 10^4 DecenasMillar + 10^3 Millares + 10^2 Centenas + 10 Decenas + Unidades =
; 10*10*10*10 DecenasMillar + 10*10*10 Millares + 10*10 Centenas + 10 Decenas + Unidades
;
; Finalmente la subrutina aplica el siguiente algoritmo:
; 10(10(10(10 DecenasMillar + Millares) + Centenas) + Decenas) + Unidades = Resultado
;
; El resultado se obtiene en 16 bits, es decir en 2 registros de 8 bits, que son:
; (Arit_Resultado_1H, Arit_Resultado_1L). Esta subrutina no tiene sistema alguno para
; detectar desbordamiento que debe preveerse en el programa que la llame.
; Previo a la llamada de esta subrutinas, cada digito del número decimal a convertir se
; almacenan en registros independientes, que son:
CBLOCK
Arit_Unidades
Arit_Decenas
Arit_Centenas
Arit_Millares
Arit_DecenasMillar
ENDC
Arit_BCD_Bin_16Bit
clrf Arit_Resultado_1H ; Realiza la carga inicial de los registros.
movf Arit_DecenasMillar,W
movwf Arit_Resultado_1L ; (Resultado Parcial) = (DecenasMillar)
;
movf Arit_Millares,W
call Arit_BCD_Operacion ; (10*DecenasMillar+Millares)
movf Arit_Centenas,W
call Arit_BCD_Operacion ; (10(10*DecenasMillar+Millares)+Centenas)
movf Arit_Decenas,W
call Arit_BCD_Operacion ; (10(10(10*DecenasMillar+Millares)+Centenas)+Decenas)
movf Arit_Unidades,W
call Arit_BCD_Operacion ; Resultado final.
return
Arit_BCD_Operacion ; Realiza la operacion: (10 * Resultado Anterior + W)
movwf Arit_Auxiliar ; Guarda la variable de entrada.
movf Arit_Resultado_1L,W
movwf Arit_Multiplicando_L ; (Resultado Anterior) --> (Multiplicando)
movf Arit_Resultado_1H,W
movwf Arit_Multiplicando_H
clrf Arit_Multiplicador_H ; Carga el multiplicador con 10.
movlw .10
movwf Arit_Multiplicador_L
call Arit_Multiplica_16Bit ; (10 * Resultado Anterior)
movf Arit_Auxiliar,W
addwf Arit_Resultado_1L,F
btfsc STATUS,C
incf Arit_Resultado_1H,F ; (10 * Resultado Anterior + W)
return