最近,我一直在FPU堆栈溢出方面遇到一些麻烦。我设法将其跟踪回到一个车厢库函数,该功能将垃圾值推到FPU堆栈上,每次被称为垃圾堆栈,并且永远不会清理。

幸运的是,这很容易再现,我确切地知道什么条件引起的。我可以将一个内联ASM块放入例程中,该例程称此例程将FPU堆栈中的最高值弹出...除了我不太知道该写什么。我的ASM-FU对Middlin来说是公平的,但不是 强的。

那么,假设它是垃圾数据,我不在乎该值的最简单方法是摆脱X86组件中FPU堆栈中最高值的最简单方法?

有帮助吗?

解决方案

如果您知道需要调整多少堆栈,则可以使用 fincstp. 。你也想 ffree 您递增的寄存器。

但是,最简单的解决方案可能是使用弹出数据传输操作之一 fstp. 。通常,您将结果存储到记忆区域以备后用,类似于:

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

但是,如果您知道您只想丢弃该价值,则可以使用 st(0) 本身作为目的地,保存内存要求:

fstp st(0)

这里 有关说明的详细指南(尤其是 这一点).

其他提示

对于Delphi/Basm,我认为弹出FPU堆栈的最简单方法是:

asm
 fstp st(0)
end;

如果 st0 是唯一使用的X87寄存器,您可以用:

ffree st0

但是,如果使用多个堆栈寄存器,这与普通POP不同,因为它没有调整堆栈顶部指针(X87状态词中的顶部字段)。

简单的FPU X87教程的寄存器章节.

st1 仍然会 st1 释放后 st0 而不是弹出,所以这通常不是您想要的,没有显着优势 fstp st0.

只需使用任何弹出的(快速)指令将其从堆栈中弹出。8087指令集

如果那不起作用,Fucompp会弹出两次。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top