5

私は、数学コプロセッサーを使用する必要がある混合 C/ASM で単純なアプリケーションを作成する任務を負っています。

指定されたポイントがシリンダー内にある場合に 1 を返すシリンダー (float x、float y、float z) 関数があります (シリンダーの底は x=0、y=0、半径 = 5、高さ = 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 (pop バリアントの FCOMP) はどのように機能するのかということです。何を何と比較しますか (st0 と st1 または st1 と st0 ?)、値が小さい/等しい/大きいかどうかはどこで確認できますか?

助けてくれてありがとう!

4

1 に答える 1

5

浮動小数点の比較は一種の苦痛です。FPUで比較を行うことはできますが、それに基づいて何かを行う前に、浮動小数点ステータスワードをCPUに転送し、気になるフラグをテストして、それに基づいて対応する必要があります。

たとえば、z> = 0.0の最初の比較は、次のようになります。

fldz
fcomp z
fnstsw ax
test ah, 041h; I *think* I've got the right flags there...
jp good
于 2011-08-25T18:56:10.063 に答える