2011-01-23 39 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;