Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- exp PROC STDCALL, fpBase:REAL4, nExp:DWORD, pfpResult:DWORD
- pushad
- finit
- xor edx, edx ; Usado para saber si debemos cambiar signo.
- mov eax, dword ptr[fpBase]
- test eax, eax
- jz Zero ; Si fpBase = 0
- fild dword ptr[nExp]
- fld dword ptr[fpBase] ; Cargamos la base.
- test eax, 80000000h ; Obtenemos el bit del signo de IEEE-754
- jz Process ; Signo positivo, no requiere cambio de signo.
- fabs ; Cargamos el valor absoluto de la base.
- mov edx, dword ptr[nExp]
- and edx, 00000001h
- Process:
- fyl2x ; Hace nExp * Log2(fpBase) donde: fpBase^nExp = 2^(nExp * Log2(fpBase))
- fld ST(0)
- frndint ; Redondea nExp * Log2(fpBase)
- fsub ST(1), ST(0) ; Resta nExp * Log2(fpBase) - Redondeado( nExp * Log2(fpBase) )
- fxch ST(1) ; Manda el resultado a ST(0)
- f2xm1 ; Efectua 2^ST(0) - 1 (Elevamos la parte decimal)
- fld1
- faddp ST(1), ST(0) ; Cancelamos el 1
- fscale ; Realiza ST(0) * 2^ST(1) (Elevamos la parte entera y multiplicamos por
- fstp ST(1) ; ... el resultado de elevar la parte decimal.
- jmp Final
- Zero:
- fldz ; 0^x = 0
- jmp Final
- Final:
- test edx, edx ; Evaluamos si debemos cambiar el signo
- jz Continue
- fchs ; Realizamos el cambio de signo
- Continue:
- mov eax, dword ptr[pfpResult]
- fstp dword ptr[eax]
- popad
- ret
- exp END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement