|
|
Inhaltsverzeichnis
Assembler: Schnell-Kurs FPU
Dies hier ist ein sehr kompakter Schnell-Kurs für Assembler für den FPU (Floating Point Unit). FPU-Assembler ganz Kurz
Um Fließpunktmathematik zu ermöglichen, wurde ein spezieller Coprozessor, die Floating Point Unit (FPU), entwickelt, der diese Operationen beschleunigt. Mit diesem wurde auch ein Satz neuer Funktionen eingeführt. Ab 486 ist die FPU interner Bestandteil des CPU-Hauptprozessors; bei früheren CPU-Typen mußte die FPU zusätzlich als ein externer Prozessor in das System eingebaut werden. FPU-Register
Die FPU benutzt eigene Operationsregister, die wie ein Stack organisiert sind. Es gibt insgesamt 8 FPU-Register die ST genannt werden, und diese werden numeriert von ST0 bis ST7. Um also mit FPU-Registern rechnen zu können, müssen die Werte in diese Register geladen werden. Anders als bei den CPU-Registern aber werden die Werte dabei immer in den ST0 kopiert und alle Werte werden um ein Register nach hinten verschoben.
Im ASM-Code gibt es für einige Operationen Standardregister, wenn keine Parameter angegeben werden. Die Stack-Register/Parameter sollten hier in diesen Codes aber immer angegeben werden, um die Register eindeutig zu bezeichnen und den Code lesbarer zu machen, auch wenn dies nicht zwingend notwendig ist -ebenso, um Funktionen erkennen zu können, die keine Parameter besitzen, und dadurch nur auf ST0 anwendbar sind.
Direkter Austausch von Daten zwischen CPU und FPU Registern ist nicht möglich, Daten müssen über den Stack oder RAM ausgetauscht werden.
Datenformate
Es werden 3 verschiedene Genauigkeiten unterstützt. Die Information teilt sich in Mantisse Exponent und das letze Bit als Signet.
Kommutativgesetz
Operationen die nicht kommutativ (vertauschbar) sind, das heißt die Reihenfolge der Parameter eine Rolle spielt, müssen zusätzlich eine Funktion besitzen der die Möglichkeit bietet die Parameter umzukehren. FADD ST, ST(1) ; -- ST0 = ST0 + ST1 FADD ST(1), ST ; -- ST1 = ST1 + ST0, Resultat ist identisch FSUB ST, ST(1) ; -- ST0 = ST0 - ST1 FSUB ST(1), ST ; -- ST1 = ST1 - ST0, Resultat ist NICHT identisch FSUBR ST, ST(1) ; -- ST0 = ST1 - ST0, Reverse Operation mit POPEs ist möglich bei einer mathematischen Operation gleichzeitig ein Stack-Pop durchzuführen, der Code kann so optimiert werden.
Normalerweise werden Resultate auf ST gespeichert. Hier bleiben die Werte unverändert FADD ST, ST(1) ; -- ST0 = ST0 + ST1 FADD ST(1), ST ; -- ST1 = ST1 + ST0, das ist auch möglich
FADDP ST(1), ST ; <- ST0 = ST1 + ST0, hier wird der Stack nach der Berechnung reduziert FPU VariantenAllgemein gelten folgende Schreibweisen ;- Normal FSUB ST, ST(1) ; -- ST0 = ST0 - ST1 FSUB ST(1), ST ; -- ST1 = ST1 - ST0 ;- Reverse FSUBR ST, ST(1) ; -- ST0 = ST1 - ST0 FSUBR ST(1), ST ; -- ST1 = ST0 - ST1 ;- POP, Normal FSUBP ST(1), ST ; <- ST0 = ST1 - ST0 ;- POP, Reverse FSUBRP ST(1), ST ; <- ST0 = ST0 - ST1 ;- Speicher FSUB [Speicher] ; -- ST0 = ST0 - [Speicher] ;- Speicher, Reverse FSUBR [Speicher] ; -- ST0 = [Speicher] - ST0 ;- Integer FISUB [Speicher] ; -- ST0 = ST0 - [Speicher] ;- Integer, Reverse FISUBR [Speicher] ; -- ST0 = [Speicher] - ST0 ;- FALSCH FSUB ST(1), ST(2) ; eine solche Operation ist nicht möglich, ein Operator muß ST0 sein FSUB ST(1), [Speicher] ; Speicher-Operationen können nur auf ST0 ausgeführt werden FPU-StackWie erwähnt sind die FPU Register Stack ähnlich aufgebaut, und so werden Werte über Push Pop ähnliche Funktionen in die Regsiter geladen.
Wieso eigentlich der FPU-Stack und nicht die Möglichkeit jedes Register einzeln anzusprechen was wesentlich mehr Möglichkeiten bieten würde? Werden zu viele Werte in die Register geladen, wird ein Stack-Overflow Fehler im FPU ausgelöst. FLD1 ; -> ST0 = 1 : Schreibt 1 in ST0 FLD ST(0) ; -> ST0 = ST0 : Kopiert ST0 in ST0 FADD ST(0), ST(0) ; -- ST0 = ST0 + ST0 FLD Val1 ; -> ST0 = Val1 : Schreibt Val1 in ST0 Danach sieht der Inhalt der FPU-Register so aus:
FSTP Val2 ; <- Val2 = ST0 : Schreibt ST0 in Val2 Danach sieht der Inhalt der FPU-Register so aus:
FPU Kommentar für Stack und Registerinhalt
Um den Code leserlich zu machen werden hier in den Asm-Codes die Stackbewegungen im Kommentar beschrieben, und der Inhalt aller Register nach dem durchführen der Operation aufgelistet.
FPU-Flag
Der FPU hat sein eigenes Flag-Register auf dem Informationen ausgegeben und Fehler angezeigt werden.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||