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.