Frage

Ich hatte in letzter Zeit einige Probleme mit FPU -Stack -Überläufen. Ich habe es geschafft, es an eine Buggy -Bibliotheksfunktion zurückzuverfolgen, die jedes Mal, wenn er aufgerufen wird, einen Müllwert auf den FPU -Stack schiebt und ihn nie aufräumt.

Glücklicherweise ist dies 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 Top -Wert vom FPU -Stack zu streichen ... außer ich weiß nicht genau, was ich schreiben soll. Mein ASM-Fu ist fair in der Middlin ', aber nicht das stark.

Was ist also der einfachste Weg, um den Top -Wert des FPU -Stacks in der X86 -Baugruppe zu beseitigen, vorausgesetzt, es handelt sich um Mülldaten, und ich kümmere mich nicht um den Wert?

War es hilfreich?

Lösung

Wenn Sie wissen, wie viel Sie den Stapel anpassen müssen, können Sie verwenden fincstp. Du willst auch ffree Die Register, über die Sie zunehmen.

Die einfachste Lösung besteht jedoch darin, einen der Poping -Datenübertragungsvorgänge wie zu verwenden fstp. Normalerweise würden Sie das Ergebnis in einem Speicherbereich für die spätere Verwendung speichern, so etwas wie:

mem_area: defs 10         ; ten bytes for 80 bits
          fstp mem_area   ; pop it

Aber wenn Sie wissen, dass Sie nur den Wert wegwerfen möchten, können Sie verwenden st(0) selbst als Ziel, speichern Sie die Speicheranforderung:

fstp st(0)

Sehen hier Für eine detaillierte Anleitung zu den Anweisungen (insbesondere zu den Anweisungen dieses Stück).

Andere Tipps

Für Delphi/Basm ist meiner Ansichts der einfachste Weg, den FPU -Stapel einmal zu knallen, meiner Ansicht nach:

asm
 fstp st(0)
end;

Wenn st0 Ist das einzige X87 -Register, das Sie verwenden können, Sie können es leeren, mit:

ffree st0

Dies unterscheidet sich jedoch von einem normalen Pop, wenn mehrere Stapelregister verwendet werden, da er den Zeiger des Top-of-Stacks nicht anpasst (oberes Feld im X87-Statuswort).

Sehen Das Register -Kapitel des Simply FPU X87 Tutorial.

st1 wäre immer noch st1 Nach dem Befreiung st0 Anstatt zu knallen, ist dies normalerweise nicht das, was Sie wollen, und hat keinen wesentlichen Vorteil gegenüber fstp st0.

Stöbern Sie einfach den Stapel mit einer (schnellen) Anweisung, die auf den Markt kommt.8087 Anweisungssatz

Wenn das nicht funktioniert, knallt Fucompp zweimal.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top