获取所有 FPU 寄存器的值,甚至 "empty" 个

Get value of all FPU registers, even "empty" ones

我正在为一个软件编写一个扩展,某些重要的值在 FPU 寄存器中。其中一些寄存器被标记为空,但它们仍然包含重要的值。因为这些寄存器被标记为空,所以每次我尝试使用 fxch 之类的东西来获取值时,比方说,st(6)st(0),所以我可以将它存储在内存中,它会自动获取更改为 NaN。

有没有办法将状态从空更改为有效或以任何方式读取这些寄存器?我知道调试器可以看到它们,但我需要使用 C++ 或 x86 ASM 以编程方式进行。

编辑: 正如你们中的一些人可能知道的那样,有一个标记寄存器将一些 FPU 寄存器标记为 "empty"。例如,当调用 FINNIT 时会发生这种情况,但是实际值位不会因此而改变,它基本上只是告诉系统,FPU 堆栈中的那些点现在是空闲的。我想从 FPU 堆栈中读取这些值,但是因为它们被标记为 "empty" 或者你可以说 "invalid" 它不适用于正常指令。我意识到,这不是一个常见的用例,但由于逆向工程,我需要这些寄存器。

具体来说:如何在 Windows、32 位上打印所有 FPU 寄存器,即使它们被标记为 "empty"?

正如 Michael Petch 所建议的那样,我能够使用 FSAVE 保存所有寄存器。然后我只需要访问内存,在那里我保存了寄存器并将它们从扩展精度表示转换为普通的 32 位浮点数。