スタックのクリーンアップの責任者を知りたい
次のように言うことができる関数 fun があるとします。
var = fun(int x, int y, float z, char x);
fun
呼び出されると、パラメータとともにスタックに入り、関数が返されたときにスタックのクリーンアップを担当するのは、関数自体または戻り値を保持する「var」です。
もう1つ、呼び出し規約の概念を説明できる人はいますか?
スタックのクリーンアップの責任者を知りたい
次のように言うことができる関数 fun があるとします。
var = fun(int x, int y, float z, char x);
fun
呼び出されると、パラメータとともにスタックに入り、関数が返されたときにスタックのクリーンアップを担当するのは、関数自体または戻り値を保持する「var」です。
もう1つ、呼び出し規約の概念を説明できる人はいますか?
あなたは自分で答えを参照しました:呼び出し規約。
呼び出し規約は、コントラクトに似ています。以下の事項を決定します。
プラットフォームやプログラミング環境に応じて、さまざまな呼び出し規約があります。x86 プラットフォームでの 2 つの一般的な呼び出し規則は次のとおりです。
stdcall
パラメータは右から左にスタックに渡されます。呼び出された関数は、スタックをクリーンアップします。
cdecl
パラメータは右から左にスタックに渡されます。呼び出し元の関数がスタックをクリーンアップします。
どちらの場合も、戻り値はEAX
レジスタにあります (またはST0
浮動小数点値の場合)。
x86 プラットフォーム用の多くのプログラミング言語では、呼び出し規約を指定できます。次に例を示します。
デルファイ
function MyFunc(x: Integer): Integer; stdcall;
マイクロソフト C/C++
int __stdcall myFunc(int x)
いくつかの使用上の注意:
単純なアプリケーションを作成する場合、呼び出し規約を変更したり知ったりする必要はほとんどありませんが、呼び出し規約を考慮する必要がある一般的なケースが 2 つあります。
詳細については、次のウィキペディアの記事をお勧めします。
呼び出し規約は、誰がスタックのクリーンアップを行っているかを示します。呼び出し元または呼び出し先。
呼び出し規約は次の点で異なります。
- パラメーターと戻り値が配置される場所 (レジスター内、コール スタック上、両方の組み合わせ)
- パラメータが渡される順序 (または単一のパラメータの一部)
- 関数呼び出しのセットアップとクリーンアップのタスクが、呼び出し元と呼び出し先の間でどのように分割されるか。
- 呼び出し先が直接使用できるレジスタも含まれる場合があります
ほとんどの場合、アーキテクチャには複数の可能な呼び出し規約があります。
その行が完了するまでに、var は fun() によって返された値を保持し、fun によって使用されるスタック上のすべてのメモリは失われます: 「プッシュ」、「ポップ」はすべて整然とします。
呼び出し規約: fun が機能するようにコンパイラーが編成するすべてのもの。これらのパラメーター x、y、z を検討してください。それらはどのような順序でスタックにプッシュされますか (実際にスタックを介して渡されますか)? 呼び出し元と呼び出し先が同意する限り、問題ではありません。コンベンションです。