Hoy vamos a dar una vuelta de tuerca a la estructura de programación.
Visto ya como se utilizaba la función rutina de la cabecera MAIN.MAC, para crear fácilmente las cabeceras de las rutinas y simplificar el código fuente de ensamblador, vamos ahora a ver como hacer lo mismo con el resto de las cabeceras, de forma que vamos a usar varias funciones ya creadas para crear una más compleja.
El resultado volverá a ser como intentamos desde el principio, un programa en ensamblador con apariencia de alto nivel. Cuanto más cabeceras y rutinas hayamos implementado, más simple queda el programa, utilizando el ensamblador puro simplemente para las inicializaciones de pilas y las características propias de la rutina implementada en el código en curso.
En este caso para realizar el exponente necesitaremos apoyarnos en el factorial, en la potencia, en la suma y en la división. Como la definición de sus macros está en la cabecera MATH.MAC, la cabecera la incluirémos en el programa mediante include al igual que hacemos con MAIN.MAC para poder usar la macro rutina.
El resultado, como se ve, es una código que declara las cabeceras, de las cuales tomaremos la forma uso de cada función, y en la que no importa que este incluida la declaración de la macro de la propia función exp, para simplificar el código.
Como vemos lo primero es tomar las variables pasadas a la función como parámetros y guardarlos en las variables locales. De esta forma podemos utilizar esta como parámetros de paso para las funciones auxiliares, usando las macros para ello.
EXP.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 ; inclusion de la cabecera main para uso de rutina
include math.mac ; inclusion de la cabecera math, para usar pot, fac, divi y suma
; no poner _modelo exe equivale a definir tipo exe
_code
rutina _exp exponente,resultado ;declaración de la función con sus variables de paso
push bx ;salvaguarda de registros usados
push di
mov ax,[bp].exponente
mov x,ax
mov x+2,0
mov di,[bp].resultado
mov n,0
mov word ptr [di],0
mov word ptr [di+2],0
mas:
pot x,n,aux ;llamada a la función potencia
fac n,aux1 ; llamada a la función factorial
divi aux,aux1,aux2 ;División
suma [di],aux2,[di] ;Suma
inc n
cmp n,13
jnz mas
pop di ; recuperación de registros usados
pop bx
pop bp
ret
_exp endp
_data ;variables locales usadas por esta función
n dw 0,0 ;variables locales usadas por esta función
x dw 0,0
aux dd 0
aux1 dd 0
aux2 dd 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.