从FPU堆栈中删除内容的最简单方法

Mas*_*ler 11 x86 assembly x87

最近我在使用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)

  • 这实际上是正确的答案.大多数x87实现都针对这种情况进行了优化,甚至不执行传输,只需将值从堆栈中弹出即可. (5认同)

pax*_*blo 8

如果你知道需要多少调整堆栈,你可以使用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)

请参阅此处以获取有关说明的详细指南(特别是此位).