Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取所有FPU寄存器的值,偶数;“空的”;一个_C++_Visual Studio_Assembly_X86_Reverse Engineering - Fatal编程技术网

C++ 获取所有FPU寄存器的值,偶数;“空的”;一个

C++ 获取所有FPU寄存器的值,偶数;“空的”;一个,c++,visual-studio,assembly,x86,reverse-engineering,C++,Visual Studio,Assembly,X86,Reverse Engineering,我正在为一个软件编写一个扩展,FPU寄存器中有一些重要的值。其中一些寄存器被标记为空,但它们仍然包含重要值。因为这些寄存器被标记为空,所以每次我试图使用类似fxch的东西来获取值,比如说,st(6)到st(0),所以我可以将其存储在内存中,它会自动更改为NaN 是否有任何方法将状态从空更改为有效或以任何方式读取这些寄存器?我知道调试器可以看到它们,但是我需要用C++或x86 ASM编程。 编辑: 正如你们中的一些人可能知道的,有一个标记寄存器,标记一些FPU寄存器为“空”。例如,当调用FINNI

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

是否有任何方法将状态从空更改为有效或以任何方式读取这些寄存器?我知道调试器可以看到它们,但是我需要用C++或x86 ASM编程。 编辑: 正如你们中的一些人可能知道的,有一个标记寄存器,标记一些FPU寄存器为“空”。例如,当调用FINNIT时,实际值位不会因此而改变,它基本上只是告诉系统,FPU堆栈中的这些点现在是空闲的。我想从FPU堆栈中读取这些值,但因为它们被标记为“空”或您可以说“无效”,所以无法使用正常指令。我意识到,这不是一个常见的用例,但由于逆向工程,我需要这些寄存器


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

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

你不能用C++来做这件事,虽然你可以用x86 ASM,但是我不知道它会有多可靠,因为它将取决于操作系统,你线程环境的细节,你有什么样的线程或纤维等等,甚至可能是你所拥有的特定类型的x86 CPU。什么是“空”登记器?如何将寄存器“标记”为空?我以前从没听说过这个。比如说这个。比多次弹出更有效,实际值保留在寄存器中。在模拟中,可以有3和4个状态位(0,1,x或0,1,x,z)甚至更多,但在现实世界中,位是0或1…而不是0,1,空。您是否考虑过使用该指令将整个FPU状态转储到内存,打印出所需的数据,然后使用该指令恢复FSAVE保存的状态。您需要恢复原始数据,因为FSAVE的副作用是在将状态保存到内存后重置整个FPU状态。