domingo, 25 de marzo de 2012

Convertir binario de 10 bits a Hexadecimal (Ensamblador para 8086)

Creo que este es el último programa que hago en el dia de hoy (espero poder dormir ya) y lo que hace este es convertir un numero binario con un maximo de 10 bits a su equivalente en Hexadecimal. Puede no sonar muy complicado (la verdad no lo es mucho ni en Assambler) pero salir de codificar de lenguajes de alto nivel como C++,Csharp a Ensamblador es un cambio fuerte aunque no dificil.

Aqui les muestro el código que desarrolle hoy y cabe decir que no creo que sea la solución mas óptima pero si la que me sacó de aguas para poder ir a dormir ya!. Como siempre por falta de práctica el tiempo es mi peor enemigo para desarrollar estos programas.


Si tienes una solución mas óptima agardeceria la compartieras ;)

Que tengan un feliz inicio de semana.

Haz Click en "expand source" para mostrar el código.
.model smal
.data
welcome db 'Bienvenido, ingrese el numero binario (10 digitos obligatorios):',0Ah,0Dh,'$'
error db 'Error numero incorrecto',0Ah,0Dh,'$'
sig db 'Ingresar otro numero? (S o s para si / cualquier otra cosa para no): $'
congrats db 'El numero en hexa es: $'
doble db 0Ah,0Ah,0Dh,'$';Doble Salto de linea
cadena db ' $'
digito1 db 00h
digito2 db 00h
digito3 db 00h
.stack
.code
dar:
mov ax,@data
mov ds,ax
mov digito1,00h
mov digito2,00h
mov digito3,00h
;limpamos pantalla
mov ah,06h
mov al,0
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,0Fh
int 10h
mov ah,02h
mov bh,0h
mov dh,0
mov dl,0
int 10h
;fin de limpieza
lea dx,welcome
call imprime

mov si,0
leer:
call solicita
mov cadena[si],al
sub cadena[si],30h
;Aqui verificamos que sea 1 o 0
cmp cadena[si],0
je continua
cmp cadena[si],1
jne err
;fin de la comparacion

continua:
inc si
cmp si,9d;mientras los digitos introducidos sean menores o iguales a 9 seguira leyendo
jbe leer;Si ya leyo el digito 10 calcula


sub si,1;Decrementa 1 (el dato que incrementamos en la condicion anterior)
calcula:
;inicia el calculo de los primeros 4 bits
mov ax,01h
push ax
mov cx,4
pot1:
mul cadena[si]
add digito1,al
dec si
pop ax
mov bx,0002h
mul bx
push ax
loop pot1
;finaliza calculo de los primeros 4bits
;inicia el calculo de los segundos 4 bits
mov ax,01h
push ax
mov cx,4
pot2:
mul cadena[si]
add digito2,al
dec si
pop ax
mov bx,0002h
mul bx
push ax
loop pot2
;finaliza calculo de los segundos 4bits
;inicia el calculo de los ultimos 2 bits
mov ax,01h
push ax
mov cx,2
pot3:
mul cadena[si]
add digito3,al
dec si
pop ax
mov bx,0002h
mul bx
push ax
loop pot3
;finaliza calculo de los ultimos 2 bits
mov dl,digito3;convertimos el digito 3 a ascci
call numero
mov digito3,dl
;convertimos el segundo digito a ascci
mov dl,digito2
cmp dl,0Ah
jae c1;si es mayor a 10 lo convertimos a letra sino a numero
call numero
jmp f1
c1:
call letra
f1:
mov digito2,dl
;fin de la conversion
;convertimos el ultimo digito a ascci
mov dl,digito1
cmp dl,0Ah
jae c2;si es mayor a 10 lo convertimos a letra sino a numero
call numero
jmp f2
c2:
call letra
f2:
mov digito1,dl
;fin de la conversion


lea dx,doble
call imprime
lea dx,congrats; imprimimos el mensaje del resultado
call imprime
mov dl,digito3;Imprimimos el digito mas significativo
call imprime_caracter
mov dl,digito2; Imprimimos el segundo digito
call imprime_caracter
mov dl,digito1;imprime el ultimo digito
call imprime_caracter
jmp again;cuando lo calcule e imprima preguntara si quiere otro



err:;Mensaje de error
lea dx,doble
call imprime
lea dx,error
call imprime
again:;Pregunta si quiere ingresar otro numero
lea dx,doble
call imprime
lea dx,sig
call imprime
call solicita
cmp al,53h
jne k ;Si es S o s vuelve a la etiqueta inicio sino finaliza
jmp dar
k:
cmp al,73h
jne fin
jmp dar

fin:
mov ax,4c00h
int 21h

solicita proc
mov ah,01h
int 21h
ret
endp

imprime proc
mov ah,09h
int 21h
ret
endp

imprime_caracter proc
mov ah,02h
int 21h
ret
endp

numero proc ;procedimiento que convierte los numeros a Ascci
add dl,30h
ret
endp

letra proc ;Prodcedimiento que convierte las letras a ascci
add dl,55d
ret
endp

6 comentarios:

  1. Felicidades Buen Programa... Eres Muy Bueno

    ResponderEliminar
    Respuestas
    1. Muchas Gracias José, agradezco tu comentario.

      Eliminar
  2. Me podrías ayudar con esta contraceña TURBONETT_FEAC0C MAC: A4:77:33:1A:B0:B1

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. COMO DESCIFRAR LAS CONTRASEÑAS CON SINONIMO 2194 EN RED Turbonett...
    Gracias

    ResponderEliminar