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:
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.
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);  
 
int main(int argc, char *argv[])  
int main(int argc, char *argv[])  
{  
{  
     //y = (1/5)sen(x)cos(z) – (3/2)cos(7a/4)e²  
     //y = (1/5)sen(x)cos(z) – (3/2)cos(7a/4)e²  
     //a = (x - PI)² + (x + PI)²  
     //a = (x - PI)² + (x + PI)²  
Línea 19: Línea 19:
     system("PAUSE");  
     system("PAUSE");  
     return 0;  
     return 0;  
}
}


Aca esta el programa en assembler:
Aca esta el programa en assembler:


global _probar  
global _probar  
 
section .data  
section .data  
 
cinco  dd 5  
cinco  dd 5  
cuatro dd 4  
cuatro dd 4  
siete  dd 7  
siete  dd 7  
 
section .text  
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  
_probar:
fldpi  
faddp st1,st0  
;obtengo (1/5)*sen(x)*cos(z) en st0:
fld st0  
fmulp st1,st0  
fld1
faddp st1,st0  
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 [siete]  
fild dword [cuatro]  
fild dword [cuatro]  
fdivp st1,st0  
fdivp st1,st0  
fmulp st1,st0  
fmulp st1,st0  
fcos  
fcos  
fstp st1  
fstp st1  


;situacion hasta el momento:  
;situacion hasta el momento:  
;  
;  
;st2 = | (1/5)*sen(x)*cos(z)  |  
;st2 = | (1/5)*sen(x)*cos(z)  |  
;st1 = | (3/2)*e^2            |  
;st1 = | (3/2)*e^2            |  
;st0 = | cos((7/4) * a)      |  
;st0 = | cos((7/4) * a)      |


;termino de hacer las cuentas:  
;termino de hacer las cuentas:  


fmulp st1,st0  
fmulp st1,st0  
fsubp st1,st0  
fsubp st1,st0  


ret
ret

Revisión del 17:46 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.

#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