Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. exp PROC STDCALL, fpBase:REAL4, nExp:DWORD, pfpResult:DWORD
  2. pushad
  3.  
  4. finit
  5.  
  6. xor edx, edx ; Usado para saber si debemos cambiar signo.
  7. mov eax, dword ptr[fpBase]
  8. test eax, eax
  9. jz Zero ; Si fpBase = 0
  10.  
  11. fild dword ptr[nExp]
  12. fld dword ptr[fpBase] ; Cargamos la base.
  13.  
  14. test eax, 80000000h ; Obtenemos el bit del signo de IEEE-754
  15. jz Process ; Signo positivo, no requiere cambio de signo.
  16.  
  17. fabs ; Cargamos el valor absoluto de la base.
  18. mov edx, dword ptr[nExp]
  19. and edx, 00000001h
  20.  
  21. Process:
  22. fyl2x ; Hace nExp * Log2(fpBase) donde: fpBase^nExp = 2^(nExp * Log2(fpBase))
  23. fld ST(0)
  24. frndint ; Redondea nExp * Log2(fpBase)
  25. fsub ST(1), ST(0) ; Resta nExp * Log2(fpBase) - Redondeado( nExp * Log2(fpBase) )
  26. fxch ST(1) ; Manda el resultado a ST(0)
  27. f2xm1 ; Efectua 2^ST(0) - 1 (Elevamos la parte decimal)
  28. fld1
  29. faddp ST(1), ST(0) ; Cancelamos el 1
  30. fscale ; Realiza ST(0) * 2^ST(1) (Elevamos la parte entera y multiplicamos por
  31. fstp ST(1) ; ... el resultado de elevar la parte decimal.
  32. jmp Final
  33.  
  34. Zero:
  35. fldz ; 0^x = 0
  36. jmp Final
  37.  
  38. Final:
  39. test edx, edx ; Evaluamos si debemos cambiar el signo
  40. jz Continue
  41.  
  42. fchs ; Realizamos el cambio de signo
  43.  
  44. Continue:
  45. mov eax, dword ptr[pfpResult]
  46. fstp dword ptr[eax]
  47.  
  48. popad
  49. ret
  50. exp END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement