英特尔处理器上的浮点组件

时间:2015-10-27 14:37:16

标签: assembly x86 reverse-engineering fpu x87

我一直在研究如何在32位英特尔机器上执行浮点运算。我已经反汇编了以下C代码行,以获取编译器如何在汇编时转换这些行。

a = 13;
b = 5;
d = (float) a / (float) b;

这是上面显示的代码的反汇编版本:

mov    DWORD PTR [ebp-0x10],0xd
mov    DWORD PTR [ebp-0x14],0x5
fild   DWORD PTR [ebp-0x10]
fild   DWORD PTR [ebp-0x14]
fdivrp st(1),st
fstp   DWORD PTR [ebp-0x18]

我觉得令人困惑的是fdivrp和fstp指令。从我读到的代码中,上面的代码将在st(1)寄存器中存储浮点除法的结果,然后弹出堆栈的顶部,使st(1)成为顶部而不是st(0)。但是,下一个fstp指令将st(0)的内容存储到地址ebp-0x18指向的内存位置,然后弹出堆栈,使st(1)成为顶层。我相信我误解了关于这些指令如何操作的文档,因为我的理解不会将结果存储在内存中。如果有人能够解释这2条指令的确切运作方式,我将不胜感激。

1 个答案:

答案 0 :(得分:4)

浮点寄存器始终相对于当前堆栈顶部进行寻址。因此,st(0)始终是堆栈顶部。 fdivrp st(1), st将结果放在st(1)中,然后立即弹出st(0),因此堆栈只包含一个项目,即包含结果的新st(0)fstp将其写入内存并将其从fpu堆栈中删除,并将其保留为空。