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