0

FPU を使用した単純な対数計算に問題があります。Visual Studio 2012 に統合された MASM コンパイラを使用しています。

LOCAL log_e_120 : REAL8;

MOV     eax, 120
MOVD    mm0, eax
MOVQ    log_e_120, mm0

FINIT

FLDLN2              ; load log_e(2)
FLD     log_e_120   ; load x
FYL2X               ; compute log_e(2)*log_2(x) = log_e(x)
FSTP    log_e_120   ; store the result

nop

レジスタ/ローカルなどの状態を表示するために、NOP 操作にブレークポイントを設定しました。

プロセスが NOP のとき、VS2010 ウォッチでローカル log_e_120 の値をデバッグしています。次のようになります。 デバッグの結果

FLD の操作はすべて、次のように適切に組み立てられています。

fld         qword ptr [log_e_120]

画面上部が REAL8 型、下から 2 番目が QWORD 型のデバッグ結果です。

また、log_e_120 のタイプを REAL8、QWORD に変更しましたが、まったく同じ効果です。

また、コードの値を適切にデバッグできません。

もちろん、結果は約 4.7874917427820458 ( wolframpha 計算) になるはずです。

4

1 に答える 1

2

整数表現から double に変換する指示を提供する必要があります

 fild local_var_120  ; where the variable is stored as integer

または、アセンブラを使用してそれを行うことができます。

 LOCAL log_e_120: REAL8 120.0
于 2012-12-22T10:19:55.057 に答える