最近我在使用FPU堆栈溢出时遇到了一些麻烦.我设法将它追溯到一个错误的库函数,每次调用它时都会将垃圾值推送到FPU堆栈,并且永远不会清理它.
幸运的是,这很容易重现,我确切地知道它导致了什么条件.我可以将一行内联ASM放入调用此例程的例程中,将最高值从FPU堆栈中弹回...除了我不太清楚要写什么.我的ASM-fu对于middlin来说是公平的,但不是那么强大.
那么在x86汇编中摆脱FPU堆栈顶部值的最简单方法是什么,假设它是垃圾数据并且我不关心它的值?
Phi*_*hiS 13
对于Delphi/BASM,在我看来,弹出FPU堆栈的最简单方法是:
asm
fstp st(0)
end;
Run Code Online (Sandbox Code Playgroud)
如果你知道需要多少调整堆栈,你可以使用fincstp.您还想要增加ffree的寄存器.
但是,最简单的解决方案可能是使用其中一种弹出式数据传输操作fstp.通常,您会将结果存储到内存区域以供以后使用,例如:
mem_area: defs 10 ; ten bytes for 80 bits
fstp mem_area ; pop it
Run Code Online (Sandbox Code Playgroud)
但是,如果您知道您只想丢弃该值,则可以将st(0)自身用作目标,从而节省内存需求:
fstp st(0)
Run Code Online (Sandbox Code Playgroud)