题
最近,我一直在FPU堆栈溢出方面遇到一些麻烦。我设法将其跟踪回到一个车厢库函数,该功能将垃圾值推到FPU堆栈上,每次被称为垃圾堆栈,并且永远不会清理。
幸运的是,这很容易再现,我确切地知道什么条件引起的。我可以将一个内联ASM块放入例程中,该例程称此例程将FPU堆栈中的最高值弹出...除了我不太知道该写什么。我的ASM-FU对Middlin来说是公平的,但不是 那 强的。
那么,假设它是垃圾数据,我不在乎该值的最简单方法是摆脱X86组件中FPU堆栈中最高值的最简单方法?
其他提示
对于Delphi/Basm,我认为弹出FPU堆栈的最简单方法是:
asm
fstp st(0)
end;
如果 st0
是唯一使用的X87寄存器,您可以用:
ffree st0
但是,如果使用多个堆栈寄存器,这与普通POP不同,因为它没有调整堆栈顶部指针(X87状态词中的顶部字段)。
st1
仍然会 st1
释放后 st0
而不是弹出,所以这通常不是您想要的,没有显着优势 fstp st0
.
只需使用任何弹出的(快速)指令将其从堆栈中弹出。8087指令集
如果那不起作用,Fucompp会弹出两次。
不隶属于 StackOverflow