Ejemplo de FPU (Organización del Computador II)

De Cuba-Wiki

el .c:

#include <math.h>

extern float probar(float,float);

int main(int argc, char *argv[]) {

   //y = (1/5)sen(x)cos(z) – (3/2)cos(7a/4)e² 
   //a = (x - PI)² + (x + PI)² 
   
   float x = 7.0; 
   float z = 5.0; 
   float a = (x-M_PI)*(x-M_PI) + (x+M_PI)*(x+M_PI);    
   float y = (1.0/5.0) * sin(x) * cos(z) - (3.0/2.0) * cos((7.0/4.0)*a) * pow(exp(1.0),2.0);
   printf("\ny: %f\n\n", y); 
   printf("\ndevolvi: %f\n\n", probar(x,z)); 
   system("PAUSE"); 
   return 0; 

}

y el .asm:

global _probar

section .data

cinco dd 5 cuatro dd 4 siete dd 7

section .text

_probar:

obtengo (1/5)*sen(x)*cos(z) en st0

fld1 fild dword [cinco] fdivp st1,st0 fld dword [esp+4] fsin fld dword [esp+8] fcos fmulp st1,st0 fmulp st1,st0

obtengo (3/2)*e^2 en st0

fld1 fld1 fadd st1,st0 fadd st0,st1 fdivrp st1,st0

fldl2e fldl2e frndint fsub st1,st0 fld1 fscale fstp st1 fxch st1 f2xm1 fld1 faddp st1,st0 fmulp st1,st0 fld st0 fmulp st1,st0

fmulp st1,st0

obtengo cos((7/4) * a) = ((7/4) * ((x - PI)² + (x + PI)²)) en st0

fld dword [esp+4]

fld st0 fldpi fsubp st1,st0 fld st0 fmulp st1,st0

fld st1 fldpi faddp st1,st0 fld st0 fmulp st1,st0 faddp st1,st0

fild dword [siete] fild dword [cuatro] fdivp st1,st0 fmulp st1,st0 fcos fstp st1

situacion hasta el momento
st2 = | (1/5)*sen(x)*cos(z) |
st1 = | (3/2)*e^2 |
st0 = | cos((7/4) * a) |
termino de hacer las cuentas

fmulp st1,st0 fsubp st1,st0

ret