Aprovechando esto, vamos a mejorar la cabecera MAIN.MAC, añadiendo una nueva macro.
En la cabecera vamos a añadir:
rutina_end macro
pop bp
ret
endp
endm
Esta nueva macro nos perimitirá, cerrar las rutinas de forma más sencilla sin necesidad de realizar la recuperación final de la pila ni el cierre del procedimiento. por lo tanto substituye a:
pop bp
ret
_scanf endp
Ahora simplemente deberemos colocar la palabra rutina_end.
No resulta complejo esto, pues el código de la llamada a la función lo tenemos siempre en las macros y por lo tanto lo podemos adaptar fácilmente.
En este caso hay que tener cuidado cuando usamos una macro como auxilio de una función. En este caso si necesitamos pasar los datos de la pila como parámetros a la macro, hay que tener en cuenta que los datos pasados por pila a la función que estamos creando ya son las direcciones de las variables de trabajo, por lo que no debemos usar una macro para llamar a la siguiente función si esta usa lea para obtener la dirección de la variable.
Si hubiéramos usado la macro itoa, en vez de colocar mov habría colocado lea de [bp].var, y nos habría dado la dirección de la pila, no la dirección de la variable. Como en [bp].var ya tenemos la dirección de la variable, guardada por la macro printf, lo que debemos hacer es simplemente poner mov.
Por todo esto, y dado que esto es algo puntual, pues se trata de la creación de nuevas librerías, cuando nos apoyemos en funciones, para crear nuevas funciones, debemos considerar que si usan en la macro la opción lea, debemos copiar el código de la macro, substituyendo los lea por mov, en vez de usarla como función.
Tenemos que tener en cuenta que si no usamos la macro debemos declarar como externa la función a usar.
Si podemos usar, en cambio, la macro puts.
PRINTV.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
include stdio.mac
_modelo exe
extrn _itoa:near
_code
rutina _printv base,var,color
push bx
push cx
push dx
push si
push di
; itoa buffer,[bp].var,[bp].base
mov ax,[bp].base
push ax
mov ax,[bp].var
push ax
lea ax,buffer
push ax
call _itoa
add sp,6
puts buffer,[bp].color
pop di
pop si
pop dx
pop cx
pop bx
rutina_end
_data
buffer db 33 dup (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.