2011-07-20 76 views
3

我想了解x86上的浮点运算的基本知识。我知道我们有一个专用的FPU和一个堆栈,但是我没有找到有关堆栈如何根据不同的指令行为的相关信息。基本的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)中的值。

回答

5

它是从顶部的偏移量。负载将现有物品进一步推入堆栈,弹出使它们移回顶端。下面是你的小程序看起来执行:

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

This reference解释这一切非常好。

+0

谢谢!该参考也非常有帮助。 – ProdigySim

1

英特尔开发人员手册将是查找特定fpu指令如何工作(以及fpu如何工作)的最佳位置。在你的例子中,首先加载x,将它放在st(0)处,当你加载y时,st(0)被下压到st(1)并且y被放入st(0)。当你满意时,st(0)变成y * x,st(1)保持x。它基本上是一个FILO堆栈(具有环绕和其他特殊功能)

+0

英特尔开发人员手册是否在线提供? – ProdigySim

+0

@ProdigySim:你可以在这里找到它们:http://www.intel.com/products/processor/manuals/ – Necrolis