Mathe: Float Basis

WRITEME

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.
Z.B. bei Addition FADDP und nicht FADD Verwenden, so dass der zweite Wert dadurch gelöscht wird und Resultat nur noch im Stack ST0 liegt.

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
 
 
 
 
 
;-------------------------------------------------------------------------------
;===============================================================================
;===============================================================================

Runtime/Mathe-Float.txt · Zuletzt geändert: 2009/04/22 21:41 (Externe Bearbeitung)