Existe un polinomio de conversión que biene a ser tal que:
(Dígito n) * base(en tu caso 16) exp (n-1) + ... Dígito 2º * base exp 1 + Dígito 1º * base exp 0= resultado
siendo "exp" exponente ó "elevado a".
En tu ejemplo (esto será más claro):
2 * 16 exp 1 + 5 * 16 exp 0 = resultado
2 * 16 exp 1=32
5 * 16 exp 0= 5
__
resultado= 37
¿como usamos esto? facil...
16= 2 exp 4 lo que significa 4 multiplicaciones por dos que es lo mismo que en un registro que cuatro desplazamientos a la izquierda.
Considerando que en 25h tenemos el 2 en un registro p.ej. AH y el 5 en otro p.ej. AL el código quedaría tal cual sigue:
xor dl,dl ; voy a guardar el resultado en dx y me interesa que esté vacio = mov dx,0
mov dl,ah ; introduzco el primer dígito en dx
shl dl,4 ; desplazo dl 4 a la izquierda, o lo que es lo mismo lo multiplico por 16
add dl,al ; sumamos el cinco con lo que ya tenemos el resultado
En el caso de tener el número hexadecimal en un registro p.ej. al=25h nos ahorramos casi todo el trabajo porque el número directamente está en la base que queramos siempre que lo extraigamos correctamente, digamos que el paso anterior ya está hecho. Para extraer el numero en base decimal basta con dividir entre 10 :
37|_10__ ax |_10__
7 3 ah al
Segun esto en al obtenemos los digitos. Cuando al <10 nos faltará un digito que está ah.
Me temo que la el post ha quedado un tanto caotico si concretas un poco más podremos centrar mejor la solución y por supuesto la respuesta.
Un placer.