Ich hatte in letzter Zeit Probleme mit FPU Stack Overflows. Ich schaffte es, es zu einer fehlerhaften Bibliotheksfunktion zurück zu verfolgen, die bei jedem Aufruf einen Müllwert auf den FPU-Stapel schiebt und ihn niemals aufräumt.
Glücklicherweise ist das leicht reproduzierbar und ich weiß genau, welche Bedingungen es verursachen. Ich kann einen Block von Inline-ASM in die Routine fallen lassen, die diese Routine aufruft, um den Höchstwert von dem FPU-Stapel zurückzuspringen ... außer dass ich nicht ganz weiß, was ich schreiben soll. Mein ASM-fu ist fair zu Middlin ', aber nicht das stark.
Also, was ist der einfachste Weg, um den obersten Wert auf dem FPU-Stack in der x86-Assembly loszuwerden, wenn man annimmt, dass es sich um Mülldaten handelt und mir der Wert egal ist?
Wenn Sie wissen, um wie viel Sie den Stack anpassen müssen, können Sie fincstp
verwenden. Sie möchten auch ffree
die Register, die Sie inkrementieren.
Die wahrscheinlich einfachste Lösung ist jedoch die Verwendung einer der Popup-Datenübertragungsoperationen wie fstp
. Normalerweise würden Sie das Ergebnis in einem Speicherbereich für die spätere Verwendung speichern, etwa wie folgt:
Wenn Sie jedoch wissen, dass Sie nur den Wert wegwerfen möchten, können Sie st(0)
self als Ziel verwenden und die Speicheranforderung speichern:
Siehe hier für eine detaillierte Anleitung zu den Anweisungen (insbesondere dieses Bit ).
Wenn es nur der oberste Wert ist, den Sie loswerden möchten:
%Vor%knalle es einfach mit einer (schnellen) Anweisung vom Stapel. 8087 Anweisungssatz
wenn das nicht funktioniert, erscheint FUCOMPP zweimal.