Einfachste Weg, um entfernen Sie etwas von dem FPU-stack
Habe ich einige Probleme in letzter Zeit mit FPU-stack-overflows. Ich es geschafft, es zu verfolgen zurück zu einem buggy-Bibliothek-Funktion, schiebt sich eine Müll Wert auf den FPU-stack jedes mal, wenn es aufgerufen wird und niemals reinigt es.
Glücklicherweise ist dies leicht reproduzierbar und ich weiß genau, welche Bedingungen verursachen. Kann ich drop ein block von inline-ASM in der routine ruft diese routine an die pop-top-Wert wieder aus dem FPU-stack... außer ich weiß nicht ganz, was zu schreiben. Meine ASM-fu ist fair zu middlin', aber nicht , dass stark.
Also, was ist der einfachste Weg, um loszuwerden, die top-Werte auf dem FPU-stack in x86 assembly, vorausgesetzt, es ist Datenmüll und ich kümmern sich nicht über den Wert?
- Für das Protokoll, x87, veraltet ist. Moderne-code wird normalerweise der XMM-Register auch für die Skalare FP Mathematik, mit Anweisungen wie
addss
(Skalare single-precision) oderaddsd
(skalaren double). Blick auf die vom compiler generierten code bei der FP Funktion für Beispiele.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wissen, wie viel Sie anpassen müssen, um den Stapel durch, die Sie verwenden können
fincstp
. Sie wollen auchffree
das Register, das Sie Schritt über.Aber wahrscheinlich die einfachste Lösung ist die Verwendung einer der popping-Daten-transfer-Operationen wie
fstp
. Normalerweise würden Sie speichern das Ergebnis in einem Speicherbereich für die spätere Verwendung, so etwas wie:Aber, wenn Sie wissen, Sie wollen einfach nur Weg zu werfen, den Wert, den Sie verwenden können
st(0)
sich als Ziel die Rettung der Speicherbedarf:Sehen hier für eine detaillierte Anleitung, die Anleitung (besonders dieses bit).
fstp/fst
mit einem register Ziel eigentlich hat man pro 0,5 c Durchsatz (D. H. 2 pro Takt) auf Haswell / Skylake. agner.org/optimize. Registrieren, umbenennen kümmert sich um die Abhängigkeit durch die top-of-stack-pointer.Für Delphi/BASM, meiner Ansicht nach, der einfachste Weg, um pop-die FPU-stack einmal ist:
Wenn
st0
ist nur die x87-register in Gebrauch sind, können Sie es leer mit:Aber dies unterscheidet sich von einem normalen pop, wenn es mehrere stack-Register verwendet, weil es sich nicht anpassen, die top-of-stack pointer (TOP-Feld in die x87-status-Wort).
Sehen das Register der Kapitel des Einfach FPU x87-tutorial.
st1
wäre nochst1
nach der Befreiungst0
statt knallen, so ist dies gewöhnlich nicht, was Sie wollen, und hat keinen Vorteil gegenüberfstp st0
.nur pop Sie aus dem Stapel mit jedem (schnell) - Anweisung, die öffnet.
8087-Befehlssatz
wenn das nicht funktioniert, FUCOMPP erscheint zweimal.