Hallo.
Vielleicht trifft nicht alles für den Einsatzzweck, der dir im Sinn steht, zu, aber da der anscheinend geheim ist, kann ich nur raten.
Geheim ist er nicht, ich will nur 64-Bit Operationen mit 386er Befehlen durchführen, und wollte mal gucken, ob das nicht auch elegant mit der FPU geht. Aber um keine Fragen offen zu lassen: Das ganze benötige ich für einen neuen Compiler, den ich grad bastle.
Daher will ich meine 64-Bit auch nicht aus einem GPR laden, sondern immer aus dem Speicher, weswegen das kein Nachteil wäre.
Und die Manuals von Intel kenne ich bereits
Ich hab mal fix ein Beispielprogramm gebastelt, was leider beweist, dass es nicht funktioniert, wie ich mir das gewünscht hätte:
fnstcw [20]
mov byte ptr [21],0F ; Control Word auf Truncate und 64-Bit Precision setzen
fldcw [20]
fild qword ptr [0] ; Laden von 123456789ABCDEF1
fild qword ptr [8] ; Laden von 11
fmul st,st(1)
fistp qword ptr [10] ; Speichert 8000000000000000
Das Ergebnis der Multiplikation ist danach 8000000000000000, eine echte 64-Bit Multiplikation hätte natürlich 3579BE02468ACE01 geliefert.
So wie es aussieht hatte ich das Truncate/Chop-Flag falsch verstanden. Die Rundung erfolgt nicht bei der Berechnung, sondern erst beim zurück-Konvertieren in einen Integer...
Außerdem sind Shift und andere Bit-Operationen mit der FPU nicht möglich, so dass kein Weg daran vorbei führt 64-Bit Berechnungen mit 2 32-Bit Registern zu machen (auf einem 386).
PS: Es werden übrigens keine Bits verschwendet, da man keine 80Bit-Floats im Speicher ablegt (80 Bit ist nur die Registerbreite die intern in der FPU verwendet wird), sondern reine 64-Bit Integer, aber das sollte auch aus meinem Programm ersichtlich sein
.