Vistas de página en total

lunes, 24 de junio de 2013

IMPRIMIR VARIABLES

 Vamos a montar la función de impresión de variables PRINTV, que es parte de la librería STDIO, y es llamada por la función   printf.
  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.