Anteriormente habíamos dicho que al enviar un carácter a lenguaje ensamblado en nuestros registros, este no lo toma como letra en si. Sino, que toma el codigo ascii de esta letra. (ya habíamos visto esa tabla)
Si bien, al mandar un numero como caracter ("2") usando el servicio 01 de la interrupcion 21h para ingresar tu valor por teclado, siempre guardara el equivalente en codigo ascii del numero en la parte alta del registro ax.
Nota: este tipo de servicios solo va a leer una sola letra o caracter.
Cuando se necesitan utilizar el valor numérico real, se debe realizar una operación sobre ese registro para poder deducir el valor real de ese codigo ascii guardado en la parte baja del registro AX
Ya sea realizar una resta de 48 o 30h (esto debido al codigo ascii de los numeros, donde el 0 es 48,etc).
Al momento de imprimir el resultado de dicha operacion(suma,resta,division etc) se debe regresar al valor de codigo ascii equivalente al resultado, por lo que se debe volver a sumar ya sea 48 o 30h.
Posteriormente para lanzar en pantalla dicho dato, usamos el servicio 02 de la interrupcion 21h para imprimir lo deseado en nuestra pantalla de comandos y mover el valor que deseamos imprimir a la parte baja del registro DX.
A continuacion dejo dos sintaxis de programas que demuestran lo siguiente:
Programa 1: Muestra un determinado mensaje una cierta cantidad de veces que el usuario elija.
.model small .stack 64 .data mensaje db "Ingrese el numero de veces que se repetira el mensaje (1-9)",13,10,'$' repetir db 13,10,"Repitiendo el ciclo $" .code inicio proc far mov ax,@data mov ds,ax mov ah,09 lea dx,mensaje int 21h mov ah,01 int 21h ;convierte a valor lo que se teclea sub al,30h mov cl,al ciclo: mov ah,09 lea dx,repetir int 21h loop ciclo ;se cierra el programa con esas lineas mov ax,4c00h inicio endp end
Por cuestiones de mejor explicación, he puesto un par de comentarios en la sintaxis de nuestro programa.
Programa 2: suma de dos números dados por el usuario y mensaje del resultado de dicha suma.
Este programa lo puedes encontrar en la siguiente liga, que en si esta entrada es un resumen de este video. Vídeo sobre servicios de interrupción 21h
.model small .stack 64 .data n1 db 0 n2 db 0 suma db 0 msg1 db "dame el primer valor:$" msg2 db 10,13,"dame el segundo valor:$" msg3 db 10,13,"Suma=$" .code begin proc far ;direccionar al segmento de datos mov ax,@data mov ds,ax ;solicita el primer dato mov ah,09 lea dx,msg1 int 21h ;se lee el primer valor mov ah,01 ;servicio 01 para leer and save in al int 21h sub al,30h ;convierte al caracter en numero mov n1,al ;solicita el otro valor mov ah,09 lea dx,msg2 int 21h ;lee el segundo valor mov ah,01 int 21h sub al,30h ;convierte el caracter a num mov n2,al ;operacion mov al,n1 add al,n2 add al,30h ;convierte a caracter mov suma,al mov ah,09 lea dx,msg3 int 21h ;imprime el caracter con el servicio ;02 de la int 21h mov ah,02 mov dl,suma ;se debe enviar a dl para imprimir int 21h ;instrucciones para cerrar el programa mov ah,4ch int 21h begin endp end
Resultado de este programa, es la peticion del programa al usuario por ambos valores y al final lanza el resultado de dicha suma.
No hay comentarios.:
Publicar un comentario