問題タブ [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 - NASM x87 FILD 命令
私はこれを読んでいて、どこにロードするかを指定せずに、値を別の場所 (st0、st1、次に st0 に戻す) に fld ロードする例を示していることに気付きました。私は、フィールドが整数をロードする手段にすぎないため、同様の方法で機能すると想定しています(または、とにかくそれが私の理解です)が、間違っている可能性があります。私の質問は次のとおりです。fld、より具体的には、値をロードする場所はどこですか? 使用する fpu レジスタを指定するパラメータはありますか、それとも 8 をループするだけですか、それともまったく別の方法がありませんか?
私が具体的に取り組んでいるコードは、3 つの数値を乗算しようとしています。1 つの方法として、st0 にロードし、次に st1 にロードし、次に st2 にロードし、次に fmul st0 と st1 (結果は st0)、次に fmul st0 と st2 にロードすることを想定しています。コードは次のとおりです。
ecx = 5 および [ebp-4] = 5
OllyDbg を使用すると、このコードがクラッシュします。00000069 でアクセス違反があったことがわかりますが、現在、それはどのレジスタにも含まれていません。
そうです、フィールドが値をロードする場所を指定する方法はありますか、どこに行くべきかを理解する良い方法はありますか?これをループで実行している場合、何かが変わりますか?
--EDIT 3-- ほとんど修正されました。大きなことの 1 つはfmul
、値を にプッシュしないことです。st0
にあるものを上書きするだけst0
です。新しいコード:
ecx
これはループして== 2 になるまで減分し、次にfild
2 と 1 を試みるとbad -NAN FFFF C0000000 00000000
、前と同じ結果になります。3 が 2 または 1 とどのように異なるのか (小さいこと以外) はわかりませんが、それは悪い値を与え始めるときです。ERROR_MOD_NOT_FOUND がスローされたことに注意する必要がありますが、すべての cpu および fpu レジスタにアクセスできる必要があるため、その意味がよくわかりません。
--EDIT 2-- Parham Alvani がドキュメンテーションで示したように、ポップを修正しました。
これは 5 回押してからbad -NAN FFFF C0000000 00000000
2 回押します。 fmul
何もしていないようです (おそらく値が悪いため)。値をロードするより良い方法はありますか? で何か間違っているようですが、最初のリンクで提供されている例によると、ここでfild
定義されているように、 st0 にプッシュするだけです。fild
--EDIT 1-- Jester が示唆したように、ループごとに fpu スタックからポップしています。
このコードはまだクラッシュします。00000009 でアクセス違反、st0 ~ 4 は 0、st5 = 100、st6 = 4、st7 = 4
x86 - 80386/80287 の組み合わせは 32 ビット モードでどのように動作しますか?
古いコンピューターのレトロコンピューティングとエミュレーションに興味があり、80287 について質問があります。
最新の FPU を使用すると、FNSAVE 命令は、CPU が 16 ビット コードを実行するときに 94 バイトのデータを書き込み、CPU が 32 ビット コードを実行するときに 108 バイトのデータを書き込みます。FSTENV 命令も同様に動作します (コード タイプに応じて 14 または 28 バイト)。
ただし、16 ビット 80286 CPU 用に設計された 80287 FPU は、32 ビット 80386 CPU と併用することもできます。
386/287 の組み合わせでページングを有効にして 32 ビット コードから呼び出した場合、FNSAVE と FSTENV はどのように動作しますか?
80287 のマニュアルでは、80386 について明示的に言及されていますが、94 バイトのデータ形式についてのみ説明されています。ただし、別のマニュアルには、94 バイトではなく 108 バイトを保存する責任があるのは 80387 ではなく 80386 であると記載されています。
また、80287 を使用すると Linux がクラッシュしたと言われている理由は何ですか?
94 バイト形式は Linux の問題に関連していますか?
ありがとう
assembly - x87 命令 FPTAN および FDIVR を使用したタンジェントの計算
tan(pi)
X87 FPTAN と FDIVR で計算したい:
しかし、コンパイルエラーが発生します
どうすればエラーを乗り切ることができますか? サイズのサフィックスが必要なようですが、命令の作成方法がわかりません。
詳細については、「gcc -v」が返されます
c - アセンブリ x86 x87 で float を使用して関数を呼び出す
私はアセンブリプログラミングが初めてで、より大きなプログラムの一部として、浮動小数点値を別の C 関数に渡す必要があります。テスト プログラムからアセンブリ関数への呼び出しがあります。これは、パラメーターを正しいスタックにプッシュするだけで、2 番目の C 関数を呼び出します。
私のCテスト関数:
x86、gcc -m32:
ext_funct
ダブルを期待しているときに32ビットしかプッシュしないことに問題があると思います。しかし、私は fldl、fld1、fildl、fldl 12 と 16(%ebp)、および「楽しみ」のために他のいくつかを試しました。
- 私の最初の質問は、ext_func がフロート スタック (ST) にいくつかのデータを欠いているため、フロート値を作成できないのですか? (呼び出し先関数を持っていないことは理解していますが、関数が何をするかは問題ではありませんか?)
- 第 2 に、コンパイラは常に f-stack にアクセスして、float 値が必要な場合に取得しますか? それとも、メモリスタックからそれらを読み取ることができますか?
- 第三に、私がここで見逃しているものは他にありますか? もし私が
しかし、他の方法でa
は、000000 で終わる大きな負の数 (100 桁程度) が返されます。
c - アセンブリ - スタックからの番号
これは私のコードの一部です:
この関数を C から呼び出しています。8 バイトなので、呼び出した値が存在するはずですが、よろしいですか? しかし、gdb に表示されるのは次のとおりです。
これは fldl 8(%ebp) の直後です。私の友人が同じプログラムを作成しましたが、うまくいきました。私は何を間違えましたか?
そして私の完全なC関数の下:
assembly - アセンブリ: 次のコードで、fld st(0) はどのようにトップ スタック値を複製しますか?
次のコードでは、 の役割について疑問に思っていfld ST(0)
ます。スタックの最上位の値が複製されると聞いたことがありますが、次のコードでその値がどこにもたらされるのかわかりません。
私の解釈では、上記のコードは象徴的な方法で次のことを意味します。
私は正しいですか?
fstp
ロードされた値をポップしないので、fld
複製したのはなぜvalue[L1000F140]
ですか?