Einfachste Möglichkeit, etwas aus dem FPU-Stack zu entfernen

8

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?

    
Mason Wheeler 23.01.2011, 04:59
quelle

4 Antworten

5

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:

%Vor%

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:

%Vor%

Siehe hier für eine detaillierte Anleitung zu den Anweisungen (insbesondere dieses Bit ).

    
paxdiablo 23.01.2011, 05:11
quelle
13

Für Delphi / BASM ist meiner Meinung nach der einfachste Weg, den FPU-Stack einmal zu öffnen:

%Vor%     
PhiS 26.01.2011 21:53
quelle
2

Wenn es nur der oberste Wert ist, den Sie loswerden möchten:

%Vor%     
Jens Björnhager 23.01.2011 13:36
quelle
0

knalle es einfach mit einer (schnellen) Anweisung vom Stapel. 8087 Anweisungssatz

wenn das nicht funktioniert, erscheint FUCOMPP zweimal.

    
Shaggieh 23.01.2011 05:30
quelle

Tags und Links