Ejemplo de FPU (Organización del Computador II)

De Cuba-Wiki

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