Diferencia entre revisiones de «Ejemplo de FPU (Organización del Computador II)»

De Cuba-Wiki
Sin resumen de edición
 
Sin resumen de edición
Línea 13: Línea 13:
     float z = 5.0;  
     float z = 5.0;  
     float a = (x-M_PI)*(x-M_PI) + (x+M_PI)*(x+M_PI);     
     float a = (x-M_PI)*(x-M_PI) + (x+M_PI)*(x+M_PI);     
     float y = (1.0/5.0) * sin(x) * cos(z) -  
     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);
              (3.0/2.0) * cos((7.0/4.0)*a) * pow(exp(1.0),2.0);  
 
     printf("\ny: %f\n\n", y);  
     printf("\ny: %f\n\n", y);  
     printf("\ndevolvi: %f\n\n", probar(x,z));  
     printf("\ndevolvi: %f\n\n", probar(x,z));  
Línea 24: Línea 22:
y el .asm:  
y el .asm:  


global _probar  
'''global _probar  


section .data  
section .data  
Línea 108: Línea 106:
fsubp st1,st0  
fsubp st1,st0  


ret
ret'''

Revisión del 17:17 13 nov 2006

aca esta el ejercicio a mi considerar mas dificil (lease largo) de la practica, lo digo a ojo porque es el unico que hice!!

#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