Debemos tener en cuenta, que lo estamos haciendo con la versión más simple de compilador, y que lo estamos haciendo a nuestro modo. No me estoy adaptando a un compilador, estoy creando el mio propio.
Es por eso que una vez se empieza este proceso, es muy difícil adaptarse a un compilador nuevo. por mucho que se sepa vender el nuevo compilador, siempre tendrá la visión de otra persona y siempre le faltarán cosas desde nuestro punto de vista.
Es por ello por lo que, mi intención no es implementar in procedimiento, sino demostar a quien lea esto post, que no necesito un gran compilador para hacer grandes cosas, y que muchas veces es mejor partir de uno sencillo, porque me permitirá hacer las cosas a mi gusto.
Cualquiera que vaya siguiendo estos pasos, ya habrá podido ver que puede cambiar los nombres de las macros, las funciones, o las etiquetas, para crear sus programas de forma más legible para él.
Igualmente podrá facilmente ampliar cualquier parte, pues no hay nada oculto, ni a nivel de directivas de compilación.
Más adelante, mostraré la forma de crear directivas de compilación para realizar if, while y for, de forma que al final estaremos creando un lenguaje basándonos en el simplemente en el compilador.
Esta es la entrada estándar por teclado. Con ella, podremos solicitar entrada de cadenas o de variables.
Lo interesante de este post es ver como ya vamos obteniendo resultados positivos del trabajo que hemos hecho hasta ahora en la estructuración y organización de nuestra librería.
Como podéis ver el código fuente de esta librería es sumamente corto. Aunque seguimos trabajando en ensamblador, y seguimos usando un compilador muy, muy simple el TASM 2.0. Sin embargo solo esixten dos instrucciones de ensamblador (pop bp y ret) que pertenecen al fin de la rutina. Como ya habreis apreciado estas funciones se mantienen siempre al final de las rutinas, pues son la recuperación de la pila y el retorno a la función principal.
En el siguiente Post haré una modificación para mejorar y completar esto, de manera que se vea lo facil que es hacer mejoras sin destruir nada de lo anterior.
!OJO¡ Al usar variables que van a ser usadas como parámetros para una función ha de tenerse en cuenta que si la variable es local se usará su nombre, pero si ha sido pasada como parámetro a la función madre ha de usarse el formato [bp].nombre de la variable. Igualmente usamos Lea si la variable es local y mov si ha sido pasada como parámetro. por eso no usamos la macro sino la copiamos cambiando los lea por mov.
SACNF.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
_code
rutina _scanf dest, base
gets numero
;atoi [bp].dest,numero+2,[bp].base
ifndef _atoi
extrn _atoi:near
endif
mov ax,[bp].base
push ax
lea ax,numero+2
push ax
mov ax,dest
push ax
call _atoi
add sp,6
pop bp
ret
_scanf endp
_data
numero db 34,0,35 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.