AnsichtenMathe: Float Basis
Log() = ln() (Unterschiedliche Schreibweise) ACHTUNG: Üblicherweise bezeichnet man mit ln() den natürlichen Logarithmus einer Zahl, mit lg() den Zehnerlogarithmus. log() sollte nie alleine stehen, sondern mit Angabe der Basis. Bsp.: log16() = Logarithmus einer Zahl zur Basis 16. Für die Operationen gilt: Das Resultat soll immer auf ST0 oder ST0, ST1 stehen und keine Zwischenresultate mehr enthalten, der restliche FPU-Stack also wieder entleert sein. 5 ^/ 2 = Sqr(5) ;=============================================================================== ;=============================================================================== ;=============================================================================== ;------------------------------------------------------------------------------- ;=============================================================================== comment * ---------------------------------------------------------------------- Infos: ------- ST ist ST(0), da es aber kein anderes Register sein kann wird die Nummer weggelassen. Die Resultate liegen auf ST. Die Resultate werden in ST nicht gelöscht und jede Berechnung schiebt ein weiteres Resultat auf den Stack. Der Grund ist, dass mehrere Berechnungen im Stack stattfinden können, ohne dass sie jedes Mal im Speicher abgelegt und wieder daraus geholt werden müssen. FINIT ist notwendig, da sonst der FPU-Stack überläuft. ------------------------------------------------------------------------------ * ;=============================================================================== ;=============================================================================== ;======= Code-Deklaration ;------------------------------------------------------------------------------- .386 ; Minimal Anforderung an Prozessor ;.486 ; Minimal Anforderung an Prozessor ;.586 ; Minimal Anforderung an Prozessor ;.model flat, stdcall ; Flat-Memory Modell 32Bit option casemap :none ; Case-Sensitive ;=============================================================================== ;======= Includes von Externen Prozessen und APIs ;------------------------------------------------------------------------------- ;=============================================================================== ;======= Public-Deklaration von Prozessen die Extern sichtbar sind ;------------------------------------------------------------------------------- ;=============================================================================== ;======= Daten-Deklarationen ;------------------------------------------------------------------------------- .data ; Daten-Block Beginn ;=============================================================================== ;=============================================================================== ;=============================================================================== ;======= Code-Beginn ;------------------------------------------------------------------------------- .code ; Code-Block Begin ;=============================================================================== ;======= Proceduren für den Code ;------------------------------------------------------------------------------- ;------------------------------------------------------------------------------- Test_Fpu_Add PROC Public Val1:TBYTE, Val2:TBYTE ;=== +, Addition ;=== ST0 = Val1 + Val2 FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 FADDP ST(1), ST ; <- ST0 = ST0 + ST1 ;@CheckOverflow FWAIT RET Test_Fpu_Add ENDP Test_Fpu_Sub PROC Public Val1:TBYTE, Val2:TBYTE ;=== -, Subtraktion ;=== ST0 = Val1 - Val2 FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 FSUBP ST(1), ST ; <- ST0 = ST0 - ST1 ;@CheckOverflow FWAIT RET Test_Fpu_Sub ENDP Test_Fpu_Mul PROC Public Val1:TBYTE, Val2:TBYTE ;=== *, Multiplikation ;=== ST0 = Val1 * Val2 FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 FMULP ST(1), ST ; <- ST0 = ST0 * ST1 ;@CheckOverflow FWAIT RET Test_Fpu_Mul ENDP Test_Fpu_Div PROC Public Val1:TBYTE, Val2:TBYTE ;=== /, Division ;=== ST0 = Val1 / Val2 FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 FDIVP ST(1), ST ; <- ST0 = ST0 / ST1 ;@CheckOverflow FWAIT RET Test_Fpu_Div ENDP ;------------------------------------------------------------------------------- Test_FpuInt_Add PROC Public Val1:TBYTE, Int2:DWORD ;=== +, Addition ;=== ST0 = Val1 + Int2 FLD Val1 ; -> ST0 = Val1 FIADD Int2 ; -- ST0 = ST0 + Int2 ;@CheckOverflow FWAIT RET Test_FpuInt_Add ENDP Test_FpuInt_Sub PROC Public Val1:TBYTE, Int2:DWORD ;=== -, Subtraktion ;=== ST0 = Val1 - Int2 FLD Val1 ; -> ST0 = Val1 FISUB Int2 ; -- ST0 = ST0 - Int2 ;@CheckOverflow FWAIT RET Test_FpuInt_Sub ENDP Test_FpuInt_Mul PROC Public Val1:TBYTE, Int2:DWORD ;=== *, Multiplikation ;=== ST0 = Val1 * Int2 FLD Val1 ; -> ST0 = Val1 FIMUL Int2 ; -- ST0 = ST0 * Int2 ;@CheckOverflow FWAIT RET Test_FpuInt_Mul ENDP Test_FpuInt_Div PROC Public Val1:TBYTE, Int2:DWORD ;=== /, Division ;=== ST0 = Val1 / Int2 FLD Val1 ; -> ST0 = Val1 FIDIV Int2 ; -- ST0 = ST0 / Int2 ;@CheckOverflow FWAIT RET Test_FpuInt_Div ENDP ;------------------------------------------------------------------------------- Test_Fpu_Pow2 PROC Public Val1:TBYTE ;=== Potenz POW 2 ;=== ST0 = Val1 POW 2 FLD Val1 ; -> ST0 = Val1 ;FLD ST(0) ; -> ST0 = Val1 , ST1=Val1 ;FMUL ST(0), ST ; <- ST0 = ST0 * ST1 FMUL ST, ST(0) ; -- ST0 = (Val1 * Val1) ;@CheckOverflow FWAIT RET Test_Fpu_Pow2 ENDP Test_Fpu_Pow3 PROC Public Val1:TBYTE ;=== Potenz POW 3 ;=== ST0 = Val1 POW 3 FLD Val1 ; -> ST0 = Val1 FLD ST(0) ; -> ST0 = Val1 , ST1=Val1 FMUL ST, ST(0) ; -- ST0 = (Val1 * Val1), ST1=Val1 ;@CheckOverflow FMULP ST(1), ST ; <- ST0 = (Val1 * Val1) POW 2 ;@CheckOverflow FWAIT RET Test_Fpu_Pow3 ENDP Test_Fpu_Pow4 PROC Public Val1:TBYTE ;=== Potenz POW 4 ;=== ST0 = Val1 POW 4 FLD Val1 ; -> ST0 = Val1 FMUL ST, ST(0) ; -- ST0 = (Val1 * Val1) ;@CheckOverflow FMUL ST, ST(0) ; -- ST0 = (Val1 * Val1) * (Val1 * Val1) ;@CheckOverflow FWAIT RET Test_Fpu_Pow4 ENDP Test_Fpu_Sqr2 PROC Public Val1:TBYTE ;=== Radifikation SQR 2 ;=== ST0 = Sqr(Val1) FLD Val1 ; -> ST0 = Val1 FSQRT ; -- ST0 = Sqr(Val1) FWAIT RET Test_Fpu_Sqr2 ENDP Test_Fpu_Sqr3 PROC Public Val1:TBYTE ;=== Radifikation SQR 3 ;=== ST0 = Val1 SQR 3 FLD Val1 ; -> ST0 = Val1 ;WRITEME FSTP ST(0) FLDZ FWAIT RET Test_Fpu_Sqr3 ENDP Test_Fpu_Sqr4 PROC Public Val1:TBYTE ;=== Radifikation SQR 4 ;=== ST0 = Val1 SQR 4 FLD Val1 ; -> ST0 = Val1 FSQRT ; -- ST0 = Sqr(Val1) FSQRT ; -- ST0 = Sqr(Val1) FWAIT RET Test_Fpu_Sqr4 ENDP ;------------------------------------------------------------------------------- Test_Fpu_Pow PROC Public Val1:TBYTE, Val2:TBYTE ;=== Potent POW X ;=== ST0 = Val1 POW Val2 FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 ;WRITEME FSTP ST(0) FLDZ FWAIT RET Test_Fpu_Pow ENDP Test_Fpu_Sqr PROC Public Val1:TBYTE, Val2:TBYTE ;=== Radifikation SQR X ;=== ST0 = Val1 SQR Val2 FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 ;WRITEME FSTP ST(0) FLDZ FWAIT RET Test_Fpu_Sqr ENDP ;------------------------------------------------------------------------------- Test_Fpu_Log2 PROC Public Val1:TBYTE ;=== Natürlicher Logarithmus Basis e ;=== ST0 = Log(Val1) FLD1 ; -> ST0 = 1 FLD Val1 ; -> ST0 = Val1 , ST1=1 ;FYL2X ST(1), ST ; <- ST0 = Log2(ST0) * ST1 FYL2X ; <- ST0 = Log2(ST0) * ST1 FWAIT RET Test_Fpu_Log2 ENDP Test_Fpu_Log10 PROC Public Val1:TBYTE ;=== Natürlicher Logarithmus Basis 10 ;=== ST0 = Log(Val1) / Log(10) FLDLG2 ; -> ST0 = Log(10) FLD Val1 ; -> ST0 = Val1 , ST1=Log(10) ;FYL2X ST(1), ST ; <- ST0 = Log2(ST0) * ST1 FYL2X ; <- ST0 = Log2(ST0) * ST1 FWAIT RET Test_Fpu_Log10 ENDP Test_Fpu_LogX PROC Public Val1:TBYTE, Val2:TBYTE ;=== Logarithmus zur Basis Val2 ;=== ST0 = Log(Val1) / Log(Val2) FLD1 ; -> ST0 = 1 FLD Val1 ; -> ST0 = Val1 , ST1=1 ;FYL2X ST(1), ST ; <- ST0 = Log2(ST0) * ST1 FYL2X ; <- ST0 = Log2(ST0) * ST1 FLD1 ; -> ST0 = 1 , ST1 = Log(Val1) FLD Val2 ; -> ST0 = LogBasis, ST1=1 , ST2=Log(Val1) ;FYL2X ST(1), ST ; <- ST0 = Log2(ST0) * ST1 FYL2X ; <- ST0 = Log2(ST0) * ST1 FDIVP ST(1), ST ; <- ST0 = ST0 / ST1 FWAIT RET Test_Fpu_LogX ENDP Test_Fpu_Exp PROC Public Val1:TBYTE ;=== Exp ;=== ST0 = Exp(Val1) FLD Val1 ; -> ST0 = Val1 FLDL2E FMULP ST(1), ST FSTCW ControlWW FLDCW RoundDown FLD ST(0) FRNDINT FLDCW ControlWW FXCH FSUB ST, ST(1) F2XM1 FLD1 FADDP ST(1), ST FSCALE FWAIT RET Test_Fpu_Exp ENDP Test_Fpu_EexpX PROC Public Val1:TBYTE ;=== EexpX ;=== e;===(Src) = antilog2(Log2(e) * Src) FLD Val1 ; -> ST0 = Val1 ;WRITEME FSTP ST(0) FLDZ FWAIT RET Test_Fpu_EexpX ENDP ;------------------------------------------------------------------------------- ;=============================================================================== ;=============================================================================== |