英特尔处理器上的浮点汇编

Floating point assembly on intel processor

我一直在研究如何在 32 位 intel 机器上执行浮点运算。我反汇编了以下 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 条指令是如何运作的,我将不胜感激。

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