6

http://en.wikipedia.org/wiki/X86_calling_conventions我々は明示的に呼び出された関数は、スタックポインタを復元するため、スタックからパラメータをpopedているはずなので、スタックをクリアするには、ESPに12を追加する必要がないのはなぜ呼び出し元がcdecl呼び出し規則でスタックをクリアする必要があるのはなぜですか?

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

...?

もう一つの問題:

理論的には、(あなたがレジスタにスタック上の引数の数を渡した場合、インスタンス用)クリーンアップ、右の世話をして呼び出し先の変数パラメータの機能を実装することが可能だろうか?

答えて

19

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

可変引数のようなものを許可します。

+0

正確に。 C関数を使うと、呼び出し元は関数を呼び出す前に好きなだけ多くの引数をスタックにプッシュできます。呼び出される関数は、どれくらい多く整理すべきか分かりません。 –

+1

呼び出されたパラメータの数は、呼び出し先にどのようにして安全にアクセスできるかをどのように知っていますか? printf()の場合は、書式文字列を解析できますが、それ以外はどのようにしますか? – anon

+0

http://an.wikipedia.org/wiki/Stdarg.h –

6

それは_cdeclヘッダこれらの規則で

上のWikipediaのページ上で右があったの発信者は、例えば、可変引数リストを可能にし、スタックから引数をきれいにします。 printf()。