ASM中的浮点数 在过去的日子里,我玩的是C++、ASM和内联ASM。我知道如何访问内存中的基本变量和类似的东西。现在,我正在尝试使用ASM中的浮点数。 我已反汇编此代码: float A = 0.058;

ASM中的浮点数 在过去的日子里,我玩的是C++、ASM和内联ASM。我知道如何访问内存中的基本变量和类似的东西。现在,我正在尝试使用ASM中的浮点数。 我已反汇编此代码: float A = 0.058;,c++,assembly,floating-point,double,inline-assembly,C++,Assembly,Floating Point,Double,Inline Assembly,我有一个结果: fld dword ptr ds:[00415744h] fstp dword ptr [ebp-8] 但我不懂这个密码。我在谷歌上搜索,但没有找到任何对我有用的东西。有人能给我解释ASM中的实数吗?有人能给我解释这个代码吗?请帮帮我。第一行将恒定浮点值0.058加载到FPU堆栈。第二行将FPU堆栈的顶部复制到CPU堆栈,由ebp-8寻址 您可以在此处或任何其他组件参考中阅读FPU说明 编辑 dword ptr[ebp-8]将FPU堆栈顶部

我有一个结果:

 fld         dword ptr ds:[00415744h]  
 fstp        dword ptr [ebp-8]

但我不懂这个密码。我在谷歌上搜索,但没有找到任何对我有用的东西。有人能给我解释ASM中的实数吗?有人能给我解释这个代码吗?请帮帮我。

第一行将恒定浮点值0.058加载到FPU堆栈。第二行将FPU堆栈的顶部复制到CPU堆栈,由ebp-8寻址

您可以在此处或任何其他组件参考中阅读FPU说明

编辑


dword ptr[ebp-8]将FPU堆栈顶部复制到堆栈上的dword size局部变量。从汇编引用中,EBP(基指针):汇编函数将基指针设置为堆栈指针,然后将其自身的内部变量放置在堆栈上。从那时起,函数引用其相对于基指针而不是堆栈指针的参数和变量。

这是编译器对代码所做的操作:

编译器将“0.058”识别为浮点文本。它分析字符串以计算它所表示的值,并将该值编码为双精度浮点值。然后,它发现您正在将此双精度值指定给单个精度对象(浮点a,而不是双精度a),因此它不需要完整的双精度值。因此编译器将其转换为单精度。产生的编码可能是0x3d6d9168,这是单精度.058的常见IEEE 754编码

在编译器生成的汇编代码中的某个地方,编译器生成了一条指令(对汇编程序的指令),该指令使该值0x3d6d9168存储在内存中。(这是一个复杂的过程;汇编程序将值写入它生成的目标文件,作为各种数据的一部分,成为程序映像的一部分。当程序准备执行或程序首次尝试访问该部分内存时,这些数据将加载到内存中。)

此外,编译器生成fld指令“fld dword ptr ds:[00415744h]”。我已经有一段时间没有使用这种组装形式了,所以我可能会稍微关闭,但我相信指令中说“使用数据段(DS)寄存器作为基址,使用0x415744作为段内的偏移量。这种组合是指向双字的指针。从那里加载四个字节到浮点堆栈。(浮点堆栈是处理器内部的一组特殊寄存器。)

fstp指令“fstp dword ptr[ebp-8]”表示“获取扩展基指针(ebp)寄存器的内容并减去8。该值是指向双字的指针。将浮点堆栈中的四个字节存储到该双字,然后将该项从浮点堆栈中弹出。”

请注意,0x415744与浮点值无关。它是内存中存储常量值的地址。这两条指令从内存中的只读位置加载常量值并将其存储到[ebp-8],这是编译器决定将值保留在变量a中的内存位置。ebp通常用于引用堆栈中的位置,因此,编译器几乎肯定会在这个函数的堆栈框架中留出一些内存来保存变量的值


我怀疑您编译此代码时关闭了优化。启用优化后,编译器可能不会费心将浮点值实际存储在分配给A的内存中。这是因为您没有立即对该值执行任何操作,只是将其存储在A中。但我们已经知道该值并将其存储在其他位置,那么为什么要费心复制它呢?相反,在代码中稍后的某个位置,即实际使用A的值的位置,编译器将从只读内存加载它,并直接在计算中使用它。(情况并非总是如此;您可以编写需要编译器进行某些复制的代码,因为根据传递给您的参数或其他因素,您的代码可能会采用多个可能路径中的一个,并且编译器需要进行复制,以确保正确的数据用于所遵循的路径。但是,一般来说,您不应该I don’我不希望在你编写的C代码和编译器生成的汇编指令之间找到精确的匹配。)

你是说“实数”,还是说“实数”?哦,对不起。浮点数看起来像x86(x87)程序集?将其标记为这样可能会有用。好的。谢谢还有一个小问题:为什么会有ebp-8?浮点为双字(4字节=32位)。那它怎么会存在于记忆中呢?