{{Stub}} Die [[FPU]] des [[x86]] - Prozessors nennt sich x87 und ist heute fest im Prozessor eingebaut. In den Anfangsjahren des x86ers war die FPU noch ein externer Chip, der auf dem Mainboard aufgelötet wurde, und nicht jeder x86 - Nutzer konnte eine FPU sein Eigen nennen. Heute ist die FPU, wie bereits erwähnt, fest im Prozessor eingebaut, weshalb man sich auch darauf verlassen kann, dass die entsprechenden FPU - Befehle auch wirklich unterstützt werden. Neben den mathematischen Befehlen, die den ursprünglichen Zweck der FPU darstellen, kann man auf der x87 - FPU auch sog. [[MMX | MultiMedia Extensions]] ausführen (die Register MM0 bis MM7 entsprechen den 80 Bit breiten FPU - Registern, wobei 16 Bits reserviert sind (man hat also nur 64 - Bit - Register zur Verfügung)). Allerdings sollte man sich vorher überlegen, ab welchem Prozessor man sein OS unterstützen will, denn Intel empfiehlt heute, anstatt der langsameren [[MMX]] - Befehle die performanteren [[SSE]] - Befehle zu verwenden, die direkt vom Hauptprozessor abgearbeitet werden. == Aufbau == Der mathematische Koprozessor des [[x86]] - Prozessors verfügt über acht 80 - Bit - [[Register]], die von ST(0) bis ST(7) angesprochen werden können. Sie werden allerdings, anders als etwa die [[x86#Allzweckregister | Allzweckregister]], wie ein Stack organisiert, d. h. ein gepushter Wert gelangt ins Register ST(0) und alle bisherigen Werte rutschen eins nach oben, also ST(1) nach ST(2), ST(2) nach ST(3) usw. et vice versa. Viele Befehle verarbeiten ST(0) und ST(1) und geben den Rückgabewert dann in ST(0) zurück. Die ersten 64 Bits in einem ST(x) - Register stellen dabei die Mantisse, also die Basis, dar, während der Rest den Exponenten darstellt, der übrigens sowohl positiv als auch negativ sein kann. Der tatsächliche Wert wird dann mit "Mantisse mal zwei hoch Exponent" berechnet. Abgesehen davon gibt es noch einige weitere Register: * Control - Word - Register * Status - Word - Register * Instruction - und Data - Pointer * Opcode - Register * Tag - Word - Register Die Register (außer Tag - Word) haben vor allem zwei Bedeutungen: * Exception Handling, wenn auf der FPU ein Fehler aufgetreten ist * Sie stellen eine Art Flags dar mit Einstellungsmöglichkeiten z. B. zur Genauigkeit oder zur Rundungsmethode Das Tag - Word - Register stellt Informationen zu den einzelnen ST(x) - Registern bereit. Es ist 16 Bits lang und bietet somit 2 Bits pro Register (die ersten zwei für ST(0) etc.): * 0b00: Der Wert im Register ist irgend ein gültiger Wert außer Null. * 0b01: Der Wert im Register ist gültig und gleich Null. * 0b10: Der Wert im Register ist ein spezieller Wert, z. B. unendlich. * 0b11: Es ist kein Wert im Register vorhanden; Das Register ist leer. Dieser Fall tritt beispielsweise auf, wenn man vor der Benutzung irgendwelcher FPU - Befehle, die auf den Stack zugreifen, ein ST(x) - Register betrachtet. Der Wert ist nicht definiert. == Befehle == Hier werden nur die mathematischen Befehle erläutert. Für die MMX - Befehle, die die FPU - Register nutzen, gibt es [[MMX | hier]] einen eigenen Artikel. Die Befehle werden hier in Intel - Assembler - Syntax angegeben. === Schiebeoperationen === ==== fild ==== Der Befehl fild lädt die angegebene Ganzzahl auf den Stack (ST(0)). fild eax ;Lädt das eax - Register in ST(0). Der ursprüngliche Wert wird nach ST(1) verschoben etc.