4

一部の x86-64 アセンブリに苦労しており、浮動小数点数が頭を悩ませています。たとえば、このコードを実行すると:

section .data
     omega:  dq 2.0
     omega2: dq 3.0

section .text
global func

func: push rbp
      mov rgp, rsp

      FINIT

      FLD qword [omega]
      FLD qword [omega2]
      FADD st0, st0

      mov rsp, rbp
      pop rbp
      ret

この関数は、次のような C コードから呼び出されます:printf("%Lf \n", func() ); 残念ながら、結果は奇妙な数値になりますFIADD... 私はすでに大量の資料を掘り下げましたが、ここの誰かが適切な FPU チュートリアルを教えてくれたり、彼女/彼の経験と知恵を共有したりできるかもしれません :)

要点のまとめ:

  • 言語: x86-64 アセンブラー
  • アセンブラ: リポジトリからインストールされた nasm v. 2.09.04
  • コンパイラ (C 用): gcc v. 4.5.2 (Ubuntu と共にインストール)
  • OS: Oracle VM 上の Ubuntu 11.04 64 ビット
  • ホスト OS: Windows 7 SP1 64 ビット
  • プロセッサー: Intel i5 - 2430M 64bit (2 回チェック:D )
  • 問題: FPU が 2 つの数値を加算できません :(

念のため:最終的にはFSINCOS他の派手なFPU命令を使用したいと思っていますが、単純な追加でさえ失敗するように見えます...

よろしくお願いします!

4

2 に答える 2

4

最終的に、私の問題は FPU レジスタがスタックとして編成されているという事実に関連していることが判明し、それに十分な注意を払わなかったため、ゴミや不要な残り物が発生しました。指示の「標準」バージョンから「ポップ」バージョンへの切り替えが役立ちました!

とにかく - 読んでくれたすべての人に感謝します。:)

誰かが興味を持っている場合 - 私は、ある惑星の運動を別の惑星 (地心モデル) のビューから計算しなければならないクラスの割り当てを行っていました。処理に変換された最終結果は、ここで表示できます。

于 2012-06-05T02:09:06.530 に答える
0

printf %fのL修飾子は、その引数をlong doubleアセンブリ データ型ではない (80 ビット浮動小数点数) にします。を削除すると、計算対象の (64 ビット浮動小数点数)Lがデフォルトになります。double

また、それは

  FADD st1, st0

2 つの数値を加算します。それ以外の場合は、2 番目の値が 2 倍になります。

于 2012-06-03T23:36:53.233 に答える