3

我试图对 x86 上的浮点运算有一个基本的了解。我知道我们有一个带有堆栈的专用 FPU,但我没有找到太多关于堆栈在不同指令方面的行为的相关信息。

基本上,fpu 寄存器的寻址让我感到困惑。如果我指的是 st(#),我是在谈论一个特定的寄存器吗?或者它是从堆栈顶部的偏移量?

我想我的大部分问题都可以通过这个例子来回答:

如果我有一个空的 FPU 堆栈,然后运行:

fld x
fld y
fmul st, st(1)

结果会是:

ST(0) = y * x
ST(1) = x

或者:

ST(0) = x * y
ST(1) = y

?

请注意,它们之间的差异是 ST(1) 中的值。

4

2 回答 2

5

这是从顶部的偏移量。负载将现有项目进一步推入堆栈,弹出使它们移回到更靠近顶部的位置。这是您的小程序的执行方式:

                   ST(0)      ST(1)
<start>            ---         ---
fld x               x          ---
fld y               y           x
fmul st(0), st(1)  y*x          x

该参考资料很好地解释了这一切。

于 2011-07-20T17:28:28.820 回答
1

英特尔开发人员手册将是查找特定 fpu 指令如何工作(以及 fpu 自身如何工作)的最佳场所。在您的示例中,首先加载 x,将其放在 st(0),当您加载 y 时,st(0) 被下推到 st(1),y 被放入 st(0)。当你 fmul 时,st(0) 变为 y * x,st(1) 保持 x。它基本上是一个 FILO 堆栈(带有环绕和一些其他特殊功能)

于 2011-07-20T17:27:49.417 回答