4

これは、C コールスタックの切り替えに関する以前の質問です。ただし、C++ は別の呼び出し規約 (thiscall) を使用するため、別の asm コードが必要になる場合があります。誰かが違いを説明し、C++ コールスタック (できれば GCC インライン asm) を切り替えるいくつかのコード スニペットを指摘または提供できますか?

ありがとう、ジェームズ

4

2 に答える 2

2

前の質問で与えられたコードはうまくいくはずです。

thiscall呼び出し規約は、スタックから引数をポップする責任があるのは誰かだけが異なります。thiscall呼び出し規約では、呼び出し先は引数をポップします(さらに、thisポインターは渡されecxます)。C呼び出し規約では、呼び出し元は引数をポップします。これはコンテキストスイッチには影響しません。

ただし、コンテキストスイッチを自分で行う場合は、スタックの切り替えに加えて、レジスタも(おそらくスタック上で)保存および復元する必要があることに注意してください。

ちなみに、C ++は常にthiscallを使用するわけではないことに注意してください。これは、引数の数が固定されているメソッドにのみ使用されます(それ以外は、Microsoftismです... g ++は使用しません)。

于 2009-09-03T14:57:22.733 に答える
2

C++ の ABI は明示的に定義されていないことに注意してください。

コンパイラの製造元は、状況に応じて最適な呼び出し規則を使用できるため、C++ を高速化できるという考えがありました。

これの欠点は、各コンパイラには独自の呼び出し規約があるため、異なるコンパイラのコードは互換性がないことです (同じコンパイラの異なるバージョン (または異なる最適化フラグ) からのコードであっても互換性がない可能性があります)。

于 2009-09-03T20:14:19.107 に答える