2011-07-20 79 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