获得所有FPU寄存器的价值,甚至是#34;空的"那些

时间:2017-05-15 00:18:38

标签: c++ visual-studio assembly x86 reverse-engineering

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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