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



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

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

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

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

就像迈克尔·佩奇建议的那样,我能够使用 FSAVE 保存所有寄存器。然后,我只需要访问内存,在那里保存寄存器并将它们从扩展精度表示转换为正常的32位浮点数。

最新更新