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

No hay comentarios:

Publicar un comentario