2009-09-03 20 views
3

ここでは、Cコールスタックの切り替えに関する私のprevious questionについて説明します。しかし、C++では異なる呼び出し規約(thiscall)を使用していて、異なるasmコードが必要な場合があります。誰かがその違いを説明し、C++コールスタックを切り替えるコードスニペット(GCCインラインasm)を指し示すことができますか?C++関数のコールスタックの切り替え

おかげで、 ジェームズ

+1

setjmp/longjmpを使用するのではなく、自分自身をローリングする理由はありますか? – moonshadow

答えて

2

前の質問に与えられたコードが正常に動作する必要があります。

thiscall calling conventionは、スタックから引数をポップする担当者のみが異なります。 thiscall呼び出し規約の下では、呼び出し先が引数をポップします(さらに、ecxにはポインタが渡されます)。 Cの呼び出し規約では、呼び出し元が引数をポップします。これはコンテキストスイッチには影響しません。

しかし、自分でコンテキストスイッチを行う場合は、スタックを切り替えるだけでなく、レジスタを保存して復元する必要があることに注意してください。

C++はthiscallを必ずしも使用するとは限りません。これは固定数の引数を持つメソッドにのみ使用されます(それ以外はMicrosoftism ... g ++では使用しません) 。

+0

Umは、隠された 'this'パラメータが呼び出し先に渡される場所についてのみ呼び出されます。 (いくつかの登録簿では、IIRCですが、私はこれで自分の深みから脱出していますので、私がここで矛盾していれば私を無視してください...) – sbi

+0

thiscallとfastcallを混同しないと確信していますか? thiscallは、fastcallがコンパイラによってスタック上に引数を渡すのではなくレジスタを渡すために実際に使われるときに、ecxで間違われてもこのポインタを渡すようにしています。 – Dmitry

+0

はい、そうだと思います。 MSDNエントリへのリンクを詳細とともに追加しました。 –

1

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

コンパイラの製造元が最適な呼び出し規約を使用してC++を高速化できるというアイデアがありました。

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

関連する問題