我正在编写软件扩展,某些重要值在FPU寄存器中。其中一些寄存器标记为空,但它们仍包含重要值。因为这些寄存器被标记为空,所以每次我尝试使用像fxch这样的东西来获取值时,让我们说st(6)
到st(0)
,所以我可以将它存储在内存中,它会自动更改为NaN。
有没有办法将状态从空更改为有效或以任何方式读取这些寄存器?我知道调试器可以看到它们,但我需要用C ++或x86 ASM以编程方式进行。
编辑: 正如你们中的一些人可能知道的那样,有一个TAG寄存器将某些FPU寄存器标记为"为空"。例如,当调用FINNIT时会发生这种情况,但实际值位不会因此而改变,它基本上只是告诉系统,FPU堆栈中的那些位置现在是空闲的。我想从FPU堆栈中读取这些值,但因为它们被标记为"空"或者你可以说"无效"它不适用于正常的指令。我意识到,它不是一个常见的用例,但由于逆向工程,我需要这些寄存器。
具体说明:如何在Windows上打印所有FPU寄存器,32位,即使它们被标记为"空"?
答案 0 :(得分:4)
就像Michael Petch建议我能够使用FSAVE保存所有寄存器。然后我只需要访问内存,我保存寄存器并将它们从扩展精度表示转换为普通的32位浮点数。