jueves, 7 de febrero de 2019

Impresión de caracteres en pantalla y lectura desde teclado.

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