Ken Shirriff hat gemeinsam mit einer Gruppe namens Opcode Collective eine detaillierte Reverse-Engineering-Analyse des FSCALE-Befehls in Intels 8087-Fließkomma-Coprozessor veröffentlicht, der 1980 auf den Markt kam. FSCALE skaliert eine Zahl um eine Zweierpotenz, indem es den Exponenten anpasst, eine Aufgabe, die im Vergleich zu Multiplikation oder Division trivial klingt.
#0748 st(0) -> tmpA Input argument from top of stack
#0749 jmp #0776 if tmpA:tag ZERO Bail if 0
#0750 stackPtr++
#0751 st(0) -> tmpB Scale argument from stack(1)
#0752 stackPtr--
#0753 jmp #0776 if tmpB:tag ZERO Bail if 0
#0754 expconst 0x403e Const 403e: exp shift to convert to int
#0755 jmp #0763 if not tmp empty/special/div
#0756 call SPECIAL_TMPS Special handling
#0757 jmp #0762 if flag
#0758 jmp #0761 if not tmpB:tag SPECIAL
#0759 except:invalid Invalid exception, use NaN
#0760 NaN -> tmpA
#0761 jmp #0776 if intr
#0762 jmp #0775 if expConv[0] Return tmpA if expConv set, otherwise continueShirriff fand das Gegenteil. Der Mikrocode von FSCALE umfasst mehr als 140 Mikrobefehle über drei Ebenen von Unterprogrammaufrufen, entnommen aus dem insgesamt 1648 Befehle großen Mikrocode-ROM des Chips. Er fotografierte einen 8087-Die (5 mal 6 Millimeter) unter dem Mikroskop, um nachzuvollziehen, wie die Routine Addierer, Schieberegister, Exponentenwandler und das Exponentenkonstanten-ROM des Chips nutzt.
Der einfache Pfad, das Skalieren einer normalen Zahl mit einem Wert ungleich null, benötigt etwa 22 Mikrobefehle ab Adresse #0748: Die beiden Stack-Argumente werden in die temporären Register tmpA und tmpB geladen, der Skalierungsfaktor wird über eine durch die Konstante 0x403e gesteuerte Schiebeoperation in eine Ganzzahl umgewandelt und anschließend zum Exponenten addiert.
Der Großteil der Komplexität stammt aus Randfällen. Ein Unterprogramm namens SPECIAL_TMPS behandelt leere Stack-Register, denormalisierte Zahlen, Unendlichkeiten und NaNs. Sind beide Operanden NaN, vergleicht der Mikrocode ihre Bruchbits und gibt den größeren Wert zurück, ein dokumentiertes, aber selten genutztes Verhalten, das Programmierern erlauben sollte, nachzuvollziehen, welcher NaN welchen Fehler ausgelöst hat. Weitere Unterprogramme, NONNORMAL_RESULT, CREATE_DENORM und ADJUST_PRECISION, kümmern sich um Überlauf, Unterlauf, die Erzeugung von Denormalzahlen und die Rundung auf die drei vom Chip unterstützten Genauigkeiten unter vier Rundungsmodi.
Shirriff ordnet den 8087 als Vorläufer von IEEE 754 ein, dem Fließkomma-Standard, den heute fast jeder Computer nutzt und der mit Beteiligung des Numerikers William Kahan entstand. Er weist darauf hin, dass Intels 8087 Support Library, ein Software-Emulator für Rechner ohne den Chip, rund 16 Kilobyte 8086-Code benötigte, um nachzubilden, was der 8087 mit etwa 3,3 Kilobyte Mikrocode leistet.




Kommentare
Noch keine Kommentare — schreib den ersten.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.