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 32: Línea 32:
   
   
  section .text  
  section .text  
 
  _probar:  
  _probar:  
   
   
Línea 88: Línea 88:
  fmulp st1,st0  
  fmulp st1,st0  
  faddp st1,st0  
  faddp st1,st0  
 
  fild dword [siete]  
  fild dword [siete]  
  fild dword [cuatro]  
  fild dword [cuatro]  
Línea 95: Línea 95:
  fcos  
  fcos  
  fstp st1  
  fstp st1  
 
  ;situacion hasta el momento:  
  ;situacion hasta el momento:  
  ;  
  ;  
Línea 101: Línea 101:
  ;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:47 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