6

出典: http://en.wikipedia.org/wiki/X86_calling_conventions

push c
push b
push a
call function_name
add esp, 12 ;Stack clearing
mov x, eax

呼び出された関数がスタックからパラメーターをポップしてスタックポインターを復元する必要があるため、スタックをクリアするために明示的に ESP に 12 を追加する必要があるのはなぜですか?

別の質問:

理論的には、呼び出し先がクリーンアップ権を処理して変数パラメーター関数を実装することは可能でしょうか (たとえば、スタック上の引数の数をレジスターに渡す場合)。

4

2 に答える 2

19

C 呼び出し規則では、呼び出された関数はパラメーターをポップしないためです。それがこの呼び出し規約のポイントです。

可変引数などを許可します。

于 2009-10-08T17:01:15.357 に答える
6

ウィキペディアのページの _cdecl ヘッダーの上にありました

これらの規則では、呼び出し元はスタックから引数を消去します。これにより、変数の引数リストが可能になります。printf()。

于 2009-10-08T17:07:18.323 に答える