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