2

スタックのクリーンアップの責任者を知りたい

次のように言うことができる関数 fun があるとします。

var = fun(int x, int y, float z, char x);

fun呼び出されると、パラメータとともにスタックに入り、関数が返されたときにスタックのクリーンアップを担当するのは、関数自体または戻り値を保持する「var」です。

もう1つ、呼び出し規約の概念を説明できる人はいますか?

4

3 に答える 3

9

あなたは自分で答えを参照しました:呼び出し規約

呼び出し規約は、コントラクトに似ています。以下の事項を決定します。

  • パラメータをクリーンアップする責任者。
  • 呼び出された関数にパラメーターを渡す方法と順序。
  • 戻り値が格納される場所。

プラットフォームやプログラミング環境に応じて、さまざまな呼び出し規約があります。x86 プラットフォームでの 2 つの一般的な呼び出し規則は次のとおりです。

stdcall

パラメータは右から左にスタックに渡されます。呼び出された関数は、スタックをクリーンアップします。

cdecl

パラメータは右から左にスタックに渡されます。呼び出し元の関数がスタックをクリーンアップします。

どちらの場合も、戻り値はEAXレジスタにあります (またはST0浮動小数点値の場合)。

x86 プラットフォーム用の多くのプログラミング言語では、呼び出し規約を指定できます。次に例を示します。

デルファイ

function MyFunc(x: Integer): Integer; stdcall;

マイクロソフト C/C++

int __stdcall myFunc(int x)

いくつかの使用上の注意:

単純なアプリケーションを作成する場合、呼び出し規約を変更したり知ったりする必要はほとんどありませんが、呼び出し規約を考慮する必要がある一般的なケースが 2 つあります。

  • Win32 API などの外部ライブラリを呼び出す場合: 互換性のある呼び出し規則を使用する必要があります。そうしないと、スタックが破損する可能性があります。
  • インライン アセンブラ コードを作成する場合: 変数を見つけるレジスタとスタック上の場所を知る必要があります。

詳細については、次のウィキペディアの記事をお勧めします。

于 2009-09-22T07:08:22.913 に答える
5

呼び出し規約は、誰がスタックのクリーンアップを行っているかを示します。呼び出し元または呼び出し先。

呼び出し規約は次の点で異なります。

  • パラメーターと戻り値が配置される場所 (レジスター内、コール スタック上、両方の組み合わせ)
  • パラメータが渡される順序 (または単一のパラメータの一部)
  • 関数呼び出しのセットアップとクリーンアップのタスクが、呼び出し元と呼び出し先の間でどのように分割されるか。
  • 呼び出し先が直接使用できるレジスタも含まれる場合があります

ほとんどの場合、アーキテクチャには複数の可能な呼び出し規約があります。

于 2009-09-22T07:04:18.913 に答える
0

その行が完了するまでに、var は fun() によって返された値を保持し、fun によって使用されるスタック上のすべてのメモリは失われます: 「プッシュ」、「ポップ」はすべて整然とします。

呼び出し規約: fun が機能するようにコンパイラーが編成するすべてのもの。これらのパラメーター x、y、z を検討してください。それらはどのような順序でスタックにプッシュされますか (実際にスタックを介して渡されますか)? 呼び出し元と呼び出し先が同意する限り、問題ではありません。コンベンションです。

于 2009-09-22T07:07:44.613 に答える