Vistas de página en total

sábado, 8 de junio de 2013

EXPONENTE

   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.