miércoles, 11 de abril de 2018

Macros - Ensamblador

; Programa que posiciona un caracter en cierta parte de la pantalla

gotoxy macro fila,col    
    mov ah,02h    ; Se encarga de posicionar el cursor en pantalla
    mov dh,fila   ; Valor de la fila en la parte alta                                                   
    mov dl,col    ; Valor de la columna parte baja
    mov bh,0h
    int 10h       ; Interrupcion para ejecutar los cambios en modo video  
endm  ; Finalizacion del macro
      ; Todo el bloque anterior de codigo funciona para posicionar el cursor en una fila y una columna
      
      ; La interrupcion int 10h es utilizada para despliegue en video, acepta el numero de funciones en el AH para el modo de pantalla     
        
pantalla macro letra
    mov ah,02h      ; Posicionamos el caracter
    mov dl,letra
    int 21h         ; Utilizamos esta interrupcion para mostrar el caracter que esta almacenado en el registro AH
endm

;La interrupcion 21h tiene varias funciones, para accesar a cada una de ellas es necesario que en el registro AH se encuentre el numero de funcion que se requiera
;Cuando tenemos el parametro 02H en nuestro registro AH la interrupcion 21h exhibe la salida
;Cuando tenemos el parametro 09H en nuestro registro AH la interrupcion 21h imprime la cadena (video)
;Cuando tenemos el parametro 40H en nuestro registro AH la interrupcion 21h despliega la escritura en dispositivo/archivo           
           
.model small
.data
.code
startup:
    mov ax,@data
    mov ds,ax
    mov ax,0003h
    int 10h
    gotoxy 10,10    ; Aqui se le asigna a nuestra macro el valor de la fila y columna donde se posicionara el cursor
    pantalla 41h    
    mov ah,01h
    int 21h         ; Cierre del programa
    mov ax,4c00h    ; Cierre del programa
    int 21h         ; Cierre del programa
end startup


; Programa que coloca un caracter en la posicion dada de acuerdo a parámetros ingresados por teclado 

gotoxy macro fila,col ; Delaracion de nuestro primer macro GOTOXY
    mov ah,02h ; Se encarga de posicionar el cursor en pantalla
    mov dh,fila  ; Valor de la fila en la parte alta            
    mov dl,col   ; Valor de la columna parte baja
    mov bh,0h
    int 10h        ; Interrupcion para ejecutar los cambios en modo video  
endm              ; Finalizacion de la macro

                 ; La interrupcion int 10h es utilizada para despliegue en video, acepta el numero de funciones en el AH para el modo de pantalla     

pantalla macro que  ; Declaracion de nuestro segundo macro PANTALLA
    mov ah,02h      ; Posicionamos el caracter
    mov dl,que
    int 21h         ; Utilizamos esta interrupcion para mostrar el caracter que esta almacenado en el registro AH
endm                ; Finalizacion de la macro

;La interrupcion 21h tiene varias funciones, para accesar a cada una de ellas es necesario que en el registro AH se encuentre el numero de funcion  que se requiera
;Cuando tenemos el parametro 02H en nuestro registro AH la interrupcion 21h exhibe la salida
;Cuando tenemos el parametro 09H en nuestro registro AH la interrupcion 21h imprime la cadena (video)
;Cuando tenemos el parametro 40H en nuestro registro AH la interrupcion 21h despliega la escritura en dispositivo/archivo           

imprime macro eztryng      ; Declaracion de nuestro tercer macro IMPRIME
    mov dx,offset eztryng  ; Se ingresan los valores en nuestro registro DX
    mov ah,9                     ; Imprime la cadena
    int 21h                         ; Utilizamos esta interrupcion para mostrar el caracter que esta almacenado en el registro AH
endm                              ; Finalizacion del macro

.data                               ; Variables
    mensaje DB "Ingrese un caracter: $"             ; Primer mensaje que nos pedira el caracter que se mostrara en pantalla    
    mensaje2 DB "Ingrese X del 0 al 9: $"           ; Segundo mensaje que nos pedira ingresar un valor del 0 al 9 para la posicion en el eje X donde se desplegara nuestro caracter
    mensaje3 DB ,13,10,"Ingrese Y del 0 al 9: $"    ; Tercer mensaje que nos pedira ingresar un valor del 0 al 9 para la posicion en el eje Y donde se desplegara nuestro caracter
    caracter DB 40
    varx DB ?
    vary DB ?

vtext db 100 dup('$')

.code

startup:
    mov ax,@data    ; Asignacion de datos en el registro AX
    mov ds,ax       ; Asignacion de datos al registro de segmento de datos
    
    imprime mensaje ; Aqui se llama a la macro con el nombre IMPRIME con el parametro MENSAJE
    mov si,00h      ; Limpia el apuntador del registro indice fuente


 leer:              ; Comienzo de la declaracion del metodo leer
    mov ax,0000     ; Aqui se realiza limpieza al registro AX
    mov ah,01h      ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo
    int 21h         ; Interrupcion del DOS

    mov caracter[si],al ; Guarda el dato capturado en la parte baja del registro AX en el registro indice fuente
    inc si                      ; Incrementa el registro indice fuente
    cmp al,0dh             ; Hace una comparacion para saber si la tecla introducida fue ENTER
    ja XY                     ; En caso de que se haya presionado ENTER, saldra el siguiente mensaje que pedira las coordenadas en X
    jb leer                    ; En caso de que no se haya presionado ENTER se volvera a ejecutar el metodo LEER

    XY:                     ; Declaracion del metodo XY
    mov dx,offset caracte; Coloca en el registro el caracter ingresado previamente
    mov ah,0ah              ; Complemento de la interrupcion 21h para leer caracteres del teclado y almacenarlos en un buffer
    int 21h                 ; Interrupcion DOS

    imprime caracter        ; Llama a nuestra macro con el nombre IMPRIME con el parametro CARACTER
    imprime mensaje2        ; Llama a nuestro macro con el nombre IMPRIME con el parametro MENSAJE2

    mov ah,01h              ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo 
    int 21h                 ; Interrupcion DOS

 sub al,30h                 ; Se le resta 30h a la parte baja de nuestro registro AX para convertirlo a valor numerico
    mov bl,al               ; Se le asigna a la parte baja de nuestro registo BX el valor de la parte baja del registro AX

    mov varx,al             ; Se le asigna a nuestra variable de la coordenada X el valor almacenado en la parte baja del registro AX

    imprime mensaje3        ; Llama a nuestro macro con el nombre IMPRIME con el parametro MENSAJE3

    mov ah,01h              ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo
    int 21h                 ; Interrupcion DOS

 sub al,30h                 ; Se le resta 30h a la parte baja de nuestro registo AX para convertirlo a valor numerico
    mov bl,al               ; Se le asigna a la parte baja de nuestro registo BX el valor de la parte baja del registro AX
    mov vary,al             ; Se le asigna a nuestra variable de la coordenada Y el valor almacenado en la parte baja del registro AX
    
    mov ax,0003h            ; Complemento de la interrupcion 10h
    int 10h                        ; Interrupcion para ejecutar los cambios en modo video  
    gotoxy vary,varx        ; Llama a la macro GOTOXY con los parametros VARX y VARY  como fila y columna
    pantalla caracter[0]    ; Llama a la macro PANTALLA con el caracter capturado previamente como parametro

    mov ah,01h               ; Complemento de la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo
    int 21h                       ; Interrupcion del DOS
    mov ax,4c00h           ; Complemento de la interrupcion 21h para finalizar el programa
    int 21h                       ; Interrupcion del DOS
                
end startup                  ; Fin del programa

No hay comentarios.:

Publicar un comentario

Exposiciones - Lenguajes de interfaz

Equipo # 1 - Programación del puerto paralelo Un puerto paralelo es una interfaz entre un computador y un periférico, cuya principal carac...