0

次のコードでは、 の役割について疑問に思っていfld ST(0)ます。スタックの最上位の値が複製されると聞いたことがありますが、次のコードでその値がどこにもたらされるのかわかりません。

fild    dword ptr [L1000F140]
fstp    qword ptr [esp+20h]
fld ST(0)
fdiv    qword ptr [L1000F148]
fmul    qword ptr [L1000A520]

私の解釈では、上記のコードは象徴的な方法で次のことを意味します。

value[esp+20h]= value[L1000F140]
new stack top value=value[esp+20h]/value[L1000F148]*value[L1000A520]

私は正しいですか?

fstpロードされた値をポップしないので、fld複製したのはなぜvalue[L1000F140]ですか?

4

1 に答える 1

1

Raymond Filiatreault による x87 FPUの優れたガイドがあります。第 1 章では、FPU レジスタ スタックのしくみについて説明します。

はい、fld st(0)スタックのトップのコピーをプッシュします。Intel insn ref マニュアルでは、この特殊なケースの使用について明示的に言及しています。fld st(n)

fstpの後にポップするのは正しいと思いますfild

  • 最初のfild / fstpペアは、グローバルint(L1000F140 で) をスタック上の float に変換します。

  • 次にfld st(0)、スタックの一番上 (つまり、 の前にあった値fild/fstp) を複製します。

  • 次に、その値を別のグローバルで割り、別のグローバルで乗算します。
  • 最終スタック:
st(0)=orig / global1 * global2
st(1)=orig
于 2015-08-01T05:30:18.237 に答える