jueves, 12 de abril de 2018

Posicionar cadena indicada por el usuario en coordenadas indicadas por el usuario

Posicionar cadena indicada por el usuario en coordenadas indicadas por el usuario

TITLE Cadena que solicita una cadena y una posición para mostrarla

gotoxy macro fila,col ; macro con nombre gotoxy con parametros fil,col
    mov ah,02h  ; posicionar cursor en pantalla
    mov dh,fila ; coordenada x para posicionar cursor
    mov dl,col  ; coordenada y para posicionar cursor
    mov bh,0h   ; posiciona en coordenadas pedidas
    int 10h
endm            ; termina macro 


pantalla macro que  ; macro pantalla con parametro que
    mov ah,02h      ; posicionar cursor en pantalla
    mov dl,que      ; recibimos caracter, y se almacena en "que"
    int 21h         
endm 


imprime macro eztryng    ;macro imprime con parametro eztryng
    mov dx,offset eztryng;coloca mensajes
    mov ah,9             ;funcion para imprimir variable
    int 21h
endm 



DATOS SEGMENT PARA PUBLIC
    mensaje DB "INGRESE UN CARACTER: ",13,10,"$"
    mensaje2 DB "INGRESE X del 0 al 9: ",13,10,"$"
    mensaje3 DB "INGRESE Y del 0 al 9: ",13,10,"$"
    caracter DB 40   ; variable para capturar cadena
    varx DB ?        ; variable para capturar coordenada x
    vary DB ?        ; variable para capturar coordenada y
vtext db 100 dup('$')


DATOS ENDS
CODIGO SEGMENT PARA PUBLIC 'code'
ASSUME CS:CODIGO,DS:DATOS
startup:
    mov ax,DATOS    ; asignacion de datos
    mov ds,ax       ; asignacion de datos al segmento datos
    
    imprime mensaje ; llama a macro imprime
    
    mov si,00h      ; limpia el apuntador SI

 leer:              ; metodo leer

    mov ax,0000     ; limpia ax
    mov ah,01h
    int 21h

    mov caracter[si],al  ;guarda dato capturado en variable de caracter
    inc si               ;incremeta el apuntador
    cmp al,0dh           ; compara si la ultima tecla presionada fue enter
    ja leer              ; si cumple brinca coordenadas
    jb leer              ; si no se cumple se vuelve a ejecutar leer

    mov dx,offset caracter ; mostrar caracter
    mov ah,0ah             ; lee cadna de texto por teclado
    int 21h

    
    imprime caracter    ; llama macro imprime con parametro caracter 


    imprime mensaje2    ; llama a macro imprime con parametro mensaje2


    mov ah,01h  ; captura lo que se teclea
    int 21h

    sub al,30h  ; resta 30 en hexadecimal para que sea reconocido como numero y no como caracter
    mov bl,al   ; se mueve a al

    mov varx,al ; se mueve a la variable varx

    imprime mensaje3   ; coordenadas y ( se repite para coordenada y)

    mov ah,01h
    int 21h

    sub al,30h
    mov bl,al
    mov vary,al
    
    mov ax,0003h      
    int 10h
    gotoxy vary,varx     ;llama a macro gotoxy con parametros varx y vary, como fil y 
    pantalla caracter[0] ;llama a macro pantalla para mostrar primer caracter

    mov ah,01h
    int 21h         ;interrupcion
    mov ax,4c00h    ;funcion de fin
    int 21h

CODIGO ENDS
end startup


Mi ejemplo Macro

Macro que cargue un mensaje del segmento de datos a AX, así nos ahorramos 3 lineas de código al momento de imprimir una cadena.

inicio macro   ;declaramos la macro, le damos el nombre de inicio
  mov ax,@data   ;Cargamos el segmento de datos.
  mov ds,ax
  mov dx,ax
endm

.model small
.stack 64
.data
  msj db 'Este es mi primer macro', 10,13,'$'
.code
  inicio  ;Llamamos al macro, lo único que hace es cargar msj del segmento de datos.
  mov ah,09h
  lea dx,msj ;puede ser mov dx,offset msj
  int 21h
  mov ax,4c00h ;Sale del programa
  int 21h
end

No hay comentarios.:

Publicar un comentario