11

関数の引数が右から左の順序でスタックにプッシュされるのはなぜですか?

4

2 に答える 2

18

printf のように、可変数の引数を持つ関数の存在を有効にします。この関数は、最初の 1 つまたは 2 つの引数を抽出し、それらの値を使用してスタック上の引数の総数を推測できます。

于 2010-10-27T09:05:46.467 に答える
10

唯一の理由は可変個引数関数のためです: スタックからポップされた最初の引数は関数の「既知の」引数であり、それらからスタックから読み取る必要がある他の引数の数を決定できます。

これが正常に機能するためには、このような呼び出し規則では、スタックのクリーンアップは、スタックにプッシュされた引数の数を知っている呼び出し元に任されていることに注意してください。これは、各関数呼び出しの後にクリーンアップ コードを記述する必要があるため、callee-cleanup よりも効率がわずかに劣ります。

これ以外に特別な理由はありません。実際には、可変引数関数を許可せず、パラメーターを左から右にプッシュするいくつかの呼び出し規則 ( PascalBorland Fastcall など) があります。

于 2010-10-27T09:11:49.987 に答える