2011-01-23 86 views
8

最近我遇到了一些麻煩,FPU堆棧溢出。我設法追蹤它回到一個錯誤的庫函數,它會在每次調用時將垃圾值推送到FPU堆棧上,並且永遠不會清理它。最簡單的方法從FPU堆棧中刪除東西

幸運的是,這很容易重現,而且我確切知道是什麼原因引起的。我可以將一塊內聯ASM放入調用此例程的例程中,以便將最高值從FPU堆棧中彈出...除非我不知道該寫什麼。我的ASM-fu對middlin公平,但不是強。

那麼,如何擺脫x86彙編中FPU堆棧的最高值,假設它是垃圾數據,我不關心這個值呢?

回答

5

如果您知道需要調整堆棧多少,可以使用fincstp。你也想ffree你增加的寄存器。

但是,最簡單的解決方案可能是使用彈出式數據傳輸操作之一,如fstp。通常你會結果存儲到內存供稍後使用的區域,是這樣的:

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 2011-01-23 05:28:00

+0

工作。謝謝! – 2011-01-23 05:34:47

0

只需彈出任何(快速)指令即可將其從堆棧中彈出。 8087 instruction set

如果這不起作用,FUCOMPP彈出兩次。

2

如果它只是你想要的頂值擺脫:

ffree st0 
13

對於德爾福/ BASM,在我看來,一旦彈出FPU堆棧最簡單的方法是:

asm 
fstp st(0) 
end;