3

x86での浮動小数点演算の基本を理解しようとしています。スタックを備えた専用のFPUがあることは理解していますが、さまざまな命令に関してスタックがどのように動作するかについて、関連する情報があまり見つかりません。

基本的に、fpuレジスタのアドレス指定は私を混乱させます。st(#)を参照する場合、特定のレジスタについて話しているのですか?それとも、スタックの一番上からのオフセットですか?

私の質問のほとんどは、この1つの例で答えられると思います。

空の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

Intel開発者マニュアルは、特定の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 に答える