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 1: Línea 1:
el .c:
Calculo la funcion usando la libreria math.h de c y despues llamo a mi programa hecho en assembler para comparar resultados, por cierto recuerden que como probar es de tipo float entonces devuelve en st0.


'''#include <math.h>  
#include <math.h>  


extern float probar(float,float);  
extern float probar(float,float);  
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) - (3.0/2.0) * cos((7.0/4.0)*a) * pow(exp(1.0),2.0);
     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("\ny: %f\n\n", y);  
     printf("\ndevolvi: %f\n\n", probar(x,z));  
     printf("\ndevolvi: %f\n\n", probar(x,z));  
     system("PAUSE");  
     system("PAUSE");  
     return 0;  
     return 0;  
}'''
}


y el .asm:  
Aca esta el programa en assembler:


global _probar  
global _probar  

Revisión del 17:23 13 nov 2006

Calculo la funcion usando la libreria math.h de c y despues llamo a mi programa hecho en assembler para comparar resultados, por cierto recuerden que como probar es de tipo float entonces devuelve en st0.

  1. 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; 

}

Aca esta el programa en assembler:

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