2011-08-25 22 views
5

私は数学コプロセッサを使用しなければならない混合C/ASMで簡単なアプリケーションを書くことを任されてきました。x87 FPOP命令とFCOM命令 - どのように動作しますか?

与えられた点が円柱の中にあれば1を返す関数円柱(float x、float y、float z)があります(円柱はx = 0、y = 0、radius = 5、height = 10)、そうでない場合は0である。

だから、シンプルに見えます。 zが< 0,10>の範囲内にあるかどうかを確認してから、x^2 + y^2をチェックしてください。< 25.

x87についての知識はありません。

私が書いたことはすべてあります。

_cylinder PROC 

push ebp 
mov ebp, esp 
sub esp,8 ; I can't use .data in the application, so I reserve some space on the stack for numbers 10 and 25 
mov [esp],10 
mov [esp+4],25 

finit 
fldz 
fld [ebp+8] 

    ;here i get stuck 

add esp, 8 
pop ebp 
_cylinder ENDP 

だから私は立ち往生した。したがって、私はアプリケーションでどのような指示を使用するかを見つけようとしています。そして、そこに私は立ち往生しています。なぜなら、私がネット上で見つけたチュートリアル/指導書リストはすべて書かれているので、何もほとんど理解できないからです。

問題は、数値演算コプロセッサから何かをポップするとどうなりますか?ポップされた値はどこで見つけることができますか?どのように80ビットの値から32ビットの値に変換するのですか(もちろんそうなら) もう1つの質問は、FCOM(ポップ・バリアントのためのFCOMP)はどのように機能するのですか?それはwhat(st0〜st1またはst1〜st0?)と何が比較され、その値がより小さいか等しいか大きいかをどこで確認できますか?

ありがとうございました!

+5

を。これははるかに簡単です(スタックの代わりにレジスタを使用する)、利用できる関数が多く、一般的に高速です。 – duskwuff

+0

duskwuffが言ったこと。 'x87'は事実上非難されており、新しいソフトウェアがそれをターゲットにする理由はほとんどありません。 –

+0

@Stephen - CPU、ベンダーではなく、一部のOSで「廃止予定」となっています(ただし、まだサポートされています)。使用する理由:例えば、80ビットの拡張精度と超越的な数学関数。 – PhiS

答えて

5

浮動小数点の比較は痛みの種です。あなたはFPUで比較を行うことができますが、それに基づいて何かをすることができる前に、浮動小数点ステータスワードをCPUに転送し、関心のあるフラグをテストし、それに基づいて反応させる必要があります。ただ、例えば

、Z> = 0.0は、このようなものになりますことをご初期の比較:あなたはあまりにも深く入る前に、SSE2の数学の代わりにx87を使用することを検討してください

fldz 
fcomp z 
fnstsw ax 
test ah, 041h; I *think* I've got the right flags there... 
jp good 
+4

ええと、それは 'テストああ、...'ではないでしょうか? [参考文献](http://webster.cs.ucr.edu/AoA/Windows/HTML/RealArithmetic.html#1000117)個人的に私は['FCOMI'](http://stackoverflow.com/questions/7057501/x86-assembler-floating-point-compare/7057771#7057771)を使用して、ステータスワードのビットマスクを使いこなすよりも簡単ですしかし、P6 +で。 – user786653

+3

@ user786653:oops - はい、それはああ、axではないはずです。謝罪いたします。はい、FCOMIは素晴らしいですが、P6が登場する頃には、私はアセンブリコードを書くほどではありませんでした。私が新しいプロセッサー用に書いていたのであれば、SSEを代わりに使用しているかもしれません。 –

+2

x86アセンブラで書かなければならないと私は同意します。 OPがx87を使用して設定されているようですので、私はそれを通り抜けようとしていました。私はまた、 'sahf' + unsignedテスト(' fcomi'と同様)を思い出すことができます。 – user786653