基本FPU指令/堆栈概述?

时间:2011-07-20 17:13:48

标签: assembly x86 x87

我正在尝试基本了解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)中的值。

2 个答案:

答案 0 :(得分:5)

这是与顶部的偏移。负载将现有物品进一步推入堆叠,弹出物使它们向后移动靠近顶部。以下是您的小程序执行的方式:

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

This reference很好地解释了这一点。

答案 1 :(得分:1)

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