問題タブ [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.

0 投票する
1 に答える
2403 参照

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 になるまで減分し、次にfild2 と 1 を試みるとbad -NAN FFFF C0000000 00000000、前と同じ結果になります。3 が 2 または 1 とどのように異なるのか (小さいこと以外) はわかりませんが、それは悪い値を与え始めるときです。ERROR_MOD_NOT_FOUND がスローされたことに注意する必要がありますが、すべての cpu および fpu レジスタにアクセスできる必要があるため、その意味がよくわかりません。

--EDIT 2-- Parham Alvani がドキュメンテーションで示したように、ポップを修正しました。

これは 5 回押してからbad -NAN FFFF C0000000 000000002 回押します。 fmul何もしていないようです (おそらく値が悪いため)。値をロードするより良い方法はありますか? で何か間違っているようですが、最初のリンクで提供されている例によると、ここfild定義されているように、 st0 にプッシュするだけです。fild

--EDIT 1-- Jester が示唆したように、ループごとに fpu スタックからポップしています。

このコードはまだクラッシュします。00000009 でアクセス違反、st0 ~ 4 は 0、st5 = 100、st6 = 4、st7 = 4

0 投票する
0 に答える
185 参照

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 の問題に関連していますか?

ありがとう

0 投票する
0 に答える
300 参照

assembly - x87 命令 FPTAN および FDIVR を使用したタンジェントの計算

tan(pi)X87 FPTAN と FDIVR で計算したい:

しかし、コンパイルエラーが発生します

どうすればエラーを乗り切ることができますか? サイズのサフィックスが必要なようですが、命令の作成方法がわかりません。

詳細については、「gcc -v」が返されます

0 投票する
1 に答える
2109 参照

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 桁程度) が返されます。

0 投票する
1 に答える
87 参照

c - アセンブリ - スタックからの番号

これは私のコードの一部です:

この関数を C から呼び出しています。8 バイトなので、呼び出した値が存在するはずですが、よろしいですか? しかし、gdb に表示されるのは次のとおりです。

これは fldl 8(%ebp) の直後です。私の友人が同じプログラムを作成しましたが、うまくいきました。私は何を間違えましたか?

そして私の完全なC関数の下:

0 投票する
1 に答える
2425 参照

assembly - アセンブリ: 次のコードで、fld st(0) はどのようにトップ スタック値を複製しますか?

次のコードでは、 の役割について疑問に思っていfld ST(0)ます。スタックの最上位の値が複製されると聞いたことがありますが、次のコードでその値がどこにもたらされるのかわかりません。

私の解釈では、上記のコードは象徴的な方法で次のことを意味します。

私は正しいですか?

fstpロードされた値をポップしないので、fld複製したのはなぜvalue[L1000F140]ですか?