2011-01-23 23 views
8

最近、FPUスタックのオーバーフローで問題が発生しています。私はそれが呼び出されるたびにFPUスタックにガベージ値をプッシュし、それを決してクリーンアップしないバグのライブラリ関数に戻して追跡しました。FPUスタックから何かを取り除く最も簡単な方法

幸いにも、これは簡単に再現可能であり、どの条件が原因であるか正確にわかります。私はインラインASMのブロックをこのルーチンを呼び出すルーチンに落として、FPUスタックから一番上の値をポップするようにすることができます。何を書くべきか分かりません。私のASM-fuはmiddlinに公正ですが、ではありません。

x86アセンブリのFPUスタックのトップ値を取り除く最も簡単な方法は、ガーベッジデータだと仮定して値を気にしないのですか?

答えて

5

スタックをどれだけ調整する必要があるか分かっている場合は、fincstpを使用できます。また、インクリメントするレジスタをffreeにすることもできます。

しかし、おそらく最も簡単な解決策は、fstpのようなポッピングデータ転送操作の1つを使用することです。通常は、後で使用するためにメモリの領域に何か結果を格納します:

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

をしかし、あなたはあなただけの値を捨てるしたい知っていれば、あなたは、保存、送信先としてst(0)自体を使用することができますメモリ要件:

fstp st(0) 

は、命令(特にthis bit)の詳細なガイドはhereを参照してください。

+0

右あなたは、@ Shaggieh、私のこれらの太った指を倒す。一定。 – paxdiablo

+0

それはうまくいった。ありがとう! –

+0

@Shaggieh:はい、しかし同じ答えで2回間違っているのはちょっと不注意です。乾杯。 – paxdiablo

0

ポップする(高速な)命令でスタックからポップするだけです。 8087 instruction set

これが機能しない場合、FUCOMPPは2回ポップします。

2

それはあなたがを取り除きたいだけ、トップ値だ場合:、デルファイ/ BASMについては

ffree st0 
13

私の見解で一度FPUスタックをポップする最も簡単な方法は次のとおりです。

asm 
fstp st(0) 
end; 
+4

これは実際には正解です。ほとんどのx87の実装は、この場合に最適化されていて、転送を実行しなくても、値をスタックからポップするだけです。 – IneQuation

関連する問題