Vistas de página en total

jueves, 20 de junio de 2013

PUTS Y GETS


   Para ir completando la librería que corresponde a STDIO y poder usarla en nuestro primer ejemplo complejo, necesitamos crear las funciones de entrada y salida de cadena. Es decir, aquellas que nos permitirán, introducir e imprimir por pantalla un texto.
    Estas son _gets, _puts y _putchar usadas en las macros scanf y printf, como una de sus opciones.
    Como se ve la función está creada apoyándonos en la macro rutina de main.mac. Por ello debemos incluir main.mac al comienzo.
    Esta función como las demás que he ido poniendo debe de compilarse y luego almacenarse en la librería. Si usáis mis .BAT, se hará con lib.bat y se creará o almacenará dentro de la librería MASM.LIB.
   Lo más evidente de esta rutina es que el _puts no utiliza la función del dos equivalente, sino trabaja directamente sobre la memoria de pantalla en la dirección B000H. Por ello es más rápida que la equivalente del DOS.
 
     PUTSGETS.ASM
; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.


include main.mac
_modelo exe
_code 
rutina _gets p1

        push es
        push di
        push dx
        push si
        mov dx, [bp].p1
        mov ah,0ah
        int 21h
        mov di, [bp].p1
        mov al, [di+1]
        xor ah, ah
        mov si, ax
        add si, di
        inc si
        inc si
        mov byte ptr [si],0
        pop si
        pop dx
        pop di
        pop es
        pop bp
        ret
_gets endp


;imprime un caracter con el color especificado en dh.
;el caracter esta en dl

rutina _putchar 
        mov caracter,al
        mov al,ah
        push ax
        mov ax,offset caracter
        push ax
        call _puts
        pop ax
        pop ax
        ret
 _putchar endp

rutina _puts p1,p2
     
        push es
        push SI
        push di
        push bx
        push dx
        push cx
        mov ax,40h
        mov es,ax
        mov dl,es:[4ah]
        mov al,es:[51h]
        xor dh,dh
        push dx
        mul dl
        xor dx,dx
        mov dl,es:[50h]
        add ax,dx
        shl ax,1
        mov di,ax
        mov al,es:[49h]
        cmp al,7
        jb sb800
        ja sa000
        mov ax,0b000h
        jmp listo

sb800:
        mov ax,0b800h
        jmp listo
sa000:
        mov ax,0a000h
 listo:
        mov bx,es:[4ch]
        sub bx,es:[4ah]
        sub bx,es:[4ah]
        mov es,ax
        mov si,[bp].p1
        mov ax,[bp].p2
        xchg ah,al
 _impr:
        mov al,[si]
        or al,al
        jz _fin_print
gestion:
        cmp al,0dh
        jnz s1
        pop dx
        push dx
        shl dx,1
        push ax
        mov ax,di
        div dl
        mul dl
        mov di,ax
        pop ax
        jmp short sin
s1:
        cmp al,0ah
        jnz s2
        pop dx
        push dx
        shl dx,1
        add di,dx
        jmp short sin
s2:
        cmp al,09h
        jnz con
        dec di
        dec di
        jmp short sin
 con:
        mov es:[di], ax
        inc di
        inc di
sin:
        inc si

;comprobar que di pasa de la longitud de pantalla y si es as¡ hacer un scroll
;de pantalla
        cmp di,bx
        jbe s3
        push ax
        push bx
        mov bh,ah
        mov ax,601h
        mov cx,0
        mov dx,184fh
        int 10h
        push es
        mov ax,40h
        mov es,ax
        sub di,es:[4ah]
        sub di,es:[4ah]
        pop es
        pop bx
        pop ax

 s3:
        jmp _impr

 _fin_print:
        pop dx
        shl dl,1
        mov ax, di
        div dl
        mov dh, al
        shr ah, 1
        mov dl, ah
        mov ah, 2
        mov bh, 0
        int 10h
        pop cx
        pop dx
        pop bx
        pop di
        pop SI
        pop es
        pop bp
        ret
_puts endp
_data 
caracter db 0,0
_end



No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.