問題タブ [x87]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 基本的なFPU命令/スタックの概要?
x86での浮動小数点演算の基本を理解しようとしています。スタックを備えた専用のFPUがあることは理解していますが、さまざまな命令に関してスタックがどのように動作するかについて、関連する情報があまり見つかりません。
基本的に、fpuレジスタのアドレス指定は私を混乱させます。st(#)を参照する場合、特定のレジスタについて話しているのですか?それとも、スタックの一番上からのオフセットですか?
私の質問のほとんどは、この1つの例で答えられると思います。
空のFPUスタックがあり、実行する場合:
結果は次のようになります:
また:
?
これらの違いはST(1)の値であることに注意してください。
optimization - SSE から最大速度を得るにはどうすればよいですか?
MXCSRのようなものに最適な設定は何ですか? どの丸めモードが最速ですか? どのプロセッサで?シグナル NaN を有効にして、計算結果が nan になったときに通知を受け取る方が高速ですか?それとも、非 NaN 計算で速度が低下しますか?
要約すると、タイトな内部 SSE ループから最大の速度を得るにはどうすればよいでしょうか?
関連する x87 浮動小数点速度のアドバイスも歓迎します。
c++ - 80ビット浮動小数点と非正規化数
(バッファ内の)80ビット拡張精度浮動小数点数をdoubleに変換しようとしています。バッファには基本的にx87レジスタの内容が含まれています。
私はIEEE標準にあまり精通していなかったので、この質問は私が始めるのに役立ちました。とにかく、私は80ビット形式の非正規化数(または非正規化数)に関する有用な情報を見つけるのに苦労しています。私が知っているのは、float32やfloat64とは異なり、仮数に隠しビットがない(1.0の暗黙の加算がない)ため、数値が正規化されているかどうかを知る1つの方法は、仮数の最上位ビットが設定されているかどうかを確認することです。 。それは私に次の質問を残します:
ウィキペディアの説明によると、float32とfloat64は、(バイアスされた)指数が0で、仮数がゼロ以外の非正規化数を示しています。
- それは80ビットのフロートで何を教えてくれますか?
- 仮数が1.0未満の80ビットフロートは、ゼロ以外の指数を持つこともできますか?
- あるいは、指数が0の80ビットフロートで仮数> = 1.0を使用することもできますか?
編集:私は質問が要約すると推測します:
FPUがx87レジスタの指数と最高仮数ビットをサニタイズすることを期待できますか?
そうでない場合、変換の結果はどのような数値になりますか?その場合、指数を完全に無視する必要がありますか?それともqNaNですか?
編集:
インテルのマニュアル(インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアル、第1巻:基本アーキテクチャー)のFPUセクションを読みましたが、これは私が恐れていたほど怖くありませんでした。結局のところ、次の値は定義されていません。
- 指数==0+最上位ビットが設定された仮数
- 指数!=0+最上位ビットが設定されていない仮数
これらの値が実際に表示される可能性があるかどうか、または内部で変換されるかどうかについては言及されていません。だから私は実際にOllydbgをほこりを払い、x87レジスタに手動でビットを設定しました。指数に設定されたすべてのビットと0の仮数を含むようにST(0)を作成しました。次に、実行させました。
に格納された値[ESP]
は、シグナリングNaNに変換されました。の後にFLD
、ST(0)
静かなNaNが含まれていました。
それが私の質問に答えると思います。J-16 SDiZのソリューションは、最も単純なソリューションであるため、受け入れました(ただし、詳細の一部は明示的に説明されていません)。
とにかく、ケースは解決しました。みなさん、ありがとうございます。
c - x87 FPOP および FCOM 命令 - これらはどのように機能しますか?
私は、数学コプロセッサーを使用する必要がある混合 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 に関する私の知識はゼロです。
私が書いたものはすべてあります。
だから私は立ち往生しました。そのため、アプリケーションで使用できる命令を見つけようとします。ネットで見つけたすべてのチュートリアル/指示リストがひどく書かれているため、ほとんど何も理解できません。
問題は、数学コプロセッサから何かをポップするとどうなるかということです。ポップされた値はどこにありますか? どのようにして 80 ビット値から 32 ビット値に変換するのですか (もちろん変換する場合)。もう 1 つの質問は、FCOM (pop バリアントの FCOMP) はどのように機能するのかということです。何を何と比較しますか (st0 と st1 または st1 と st0 ?)、値が小さい/等しい/大きいかどうかはどこで確認できますか?
助けてくれてありがとう!
opcode - 特定のx87FPU命令のデコードのあいまいさ
x87FPU命令のデコードに関してあいまいなケースに直面しています。Vol2AIntelの命令セットマニュアル[1]の3-380ページから抜粋した次の命令を参照してください。
これらの命令は両方とも同じシングルバイトベースのオペコードを持っています0xD9
。最初の命令の拡張オペコードは0x00
。です。拡張オペコードは、ModR/Mバイトの「reg」フィールドで指定されます。ただし、2番目の命令は、「レジスタを取得するために追加」機能を備えた2バイトのオペコードです。この意味は:
これら2つの指示を区別することに関して私は小さな問題を抱えています。小さな例は次のとおりです。
ここで、オペコードシーケンスを取得するとします"D9 C1"
。それが命令"FLD m32fp"
であるかどうかを確認する必要がある場合は、ModR/Mバイトの「reg」フィールドが0x00であるかどうかを確認する必要があります。もしそうなら、それは確か"FLD m32fp"
に使用されている命令です。
のバイナリ表現はC1
です"1100 0001"
。bit0がLSBであるとすると、bit3-bit5(両端を含む)はModR/Mバイトの「reg」フィールドを構成します"C1"
。0x00
確かに(3つのゼロ)であることがわかります。
そこで、オペコードシーケンス"D9 C1"
を命令にマッピングし"FLD m32fp"
ます。"ecx"
さらにデコードすると、この場合、オペランドが実際になることがわかります。しかし、これに"FLD ST1"
もオペコードシーケンス"D9 C1"
があり、これがそのオペコードシーケンスに使用されている実際の命令であることがわかります。
"D9 C1"
本質的に、オペコードシーケンスが命令に対応し、では"FLD ST1"
ないことをどのように確認でき"FLD ecx"
ますか?
"FMUL"
ここと同じようにオペランドをとるので、命令についても非常によく似た問題が発生"FLD"
します。
[1] http://www.intel.com/design/intarch/manuals/243191.HTM
よろしくお願い
いたします。HrishikeshMurali
assembly - アセンブリ8086; 浮動小数点数、加算、減算
浮動小数点を使用した数値について詳しく知るには、いくつかのリソースが必要です。emu8086環境でその種類の数値の加算および減算演算をコード化する必要があります...。
どんな助けでも大歓迎です
assembly - 組み立て CW の RC ビットを設定する方法は?
RC の FPU ビットのコントロール ワードを 3 に設定する方法を教えてください。
回答(編集者注:質問の一部として回答を投稿しないでください。ただし、今のところここにあります)
assembly - x86アセンブリで浮動小数点数を分割する方法は?
ECX レジスタから sqrt をカウントする Heron アルゴリズムを作成しようとすると、機能しません。結果が整数であるため、浮動小数点数の除算に問題があるようです。
私のアルゴリズム:
floating-point - nasm 浮動小数点エラー
浮動小数点スタックの操作に取り組んでいます:
何らかの理由で、 get の式をコメントアウトするとeq2
、前の式 get で正しい出力が得られますres1
。
しかし、式 2 のコメントを外しておく0
と、出力として
次の方程式についても同じことが言えます。前の方程式の後に関数があると、何らかの理由でそれがゼロになります。
誰もこの問題に直面したことがありますか?
印刷機能はこちら