関数呼び出し規約の三種類
免責事項:この記事はブロガーのオリジナルの記事、再現され、元のソースのリンクと、この文を添付してください。2019-10-02,22:24:48。
浮き沈みの-----溺れて心----ブログパーク
概要
大会には、いくつかの関数を呼び出すことであるとき、関数呼び出し規則、を含みます:
Yazhan次関数のパラメータ、
- 発信者またはポップ呼び出し先パラメータによって、
- そして、修正関数名の製造方法。
- 関数パラメータをプッシュ発信者がいくつかのパラメータ(関数の定義)、送信パラメータの関数がスタックによって実行されたときに呼び出される関数を必要とする、ためです。呼び出し側は、呼び出し機能で使用するためにスタックにプッシュされた特定のシーケンスパラメータであろう。あなたや、呼び出し元プロセスが完了する呼び出し、管理スタック領域を指し、ポップ、このパラメータを、呼んでいる:発信者をスタックにあなたのスタックベース(EBP)を接続するために、スタックの現在のトップ(ESP)の割り当てその後、新しいEBPとしてスタックの最下部、およびに呼び出された関数が使用するスタック領域としてスタックの新しい一番下に基づくスタック空間の新しい部分を開きます。これを空に戻る際、発信者またはこれと呼ばれるとは何であるのパラメータのスタック領域(既に完成の使用)を押し上げ。修飾された名前を生成する方法の機能は、この機能は、フォーマット文字列規則の文字列の記述は呼び出しに応じて異なるであろう生成する関数を呼び出し、コンパイルを指します。
呼び出し規約のすべてのタイプの概要
メイン集計] __cdecl、__ stdcall規約、__ fastcall、__ nakedcall、__ thiscall、__いくつかの原則の呼び出し規約パスカル。(ブログ記事に裸)
- __cdecl
CおよびC ++は、デフォルトの呼び出し規約(あなたが書いたと書かないで、__cdeclであるかどうか)です。
- 右から左へのパラメータをプッシュします
- 呼び出し側の保守パラメータメモリスタック
- 装飾名の形式は、例えば、_function元の関数名の前にアンダースコアであります
- __stdcall
CおよびC ++のWin32 API関数を呼び出すための標準的な方法は、一般的にこの方法を呼び出します。
- 右から左へのパラメータをプッシュします
- これは、彼らに戻るには、関数の前にスタックメモリ管理パラメータ、すなわち空のスタックと呼ばれ、
- 装飾された名前の形式は_functionとして、元の関数名の前にアンダースコア、関数の元の名前プラス@です@
- __fastcall
fastcallは、高速呼び出し規約が速くfastcall、スタックメモリへの読み出しパラメータに比べて、レジスタにパラメータを渡します:
- 2以下ECXを使用し、EDXパラメータを登録し、順次右から左図に他のパラメータの送信前にDWORD
- 呼び出された関数は、メモリ・スタックパラメータを管理する責任があります
- 各適用修正は、元の関数名とリア前に名前フォーマット@であり、バイトの数は、16 @関数と関数パラメータを、続いて
- __thiscall
C ++での呼び出し規約C ++クラスのメンバ関数のデフォルト、クラスのメンバーは、このポインタの特殊性を持っているので、thiscallは特別な処理を必要とします:
- 右から左にスタックにパラメータ
- 呼び出しの引数の不定数は、発信者、発信者またはメモリ管理スタックによってによってメモリ・スタックを管理する責任があり、パラメータの数が決定した場合、ECXレジスタによって、このポインタは、それ以外の場合はスタックにすべてのパラメータの後に、呼び出される関数にこのポインタを渡しますスタックは、呼び出し側に渡され
- __nakedcall
まれに、この呼び出し規約を使用しないnakedcall呼び出し規約では、コンパイラは、この関数に初期化とクリーンアップコードを増加させないであろう、より特別には、あなただけ返される結果のコンパイルに挿入することができ、戻り値戻り値を返すことができないということです。
- __パスカル
そして、いくつかの異なる上記パスカル呼び出し規約:
- 左からパラメータのプッシュを右に
- 呼び出し先、スタックの管理パラメータ