От: http://en.wikipedia.org/wiki/X86_calling_conventionsПочему вызывающему абоненту необходимо очистить стек в соглашении о вызове cdecl?
push c
push b
push a
call function_name
add esp, 12 ;Stack clearing
mov x, eax
Почему мы должны явно добавить 12 к ESP, чтобы очистить стек, так как вызываемая функция должна poped параметры из стека поэтому возвращающей указатель стека ...?
Другой вопрос:
Теоретически, можно было бы реализовать различные функции параметров с вызываемым заботясь о праве очистки (например, если вы передаете количество аргументов в стеке в реестре)?
Точно. С помощью функций C вызывающий может вызывать столько аргументов в стеке, сколько ему нравится, прежде чем вызывать функцию. Вызываемая функция просто не знает, сколько должно быть очищено. –
Каким образом вызывающий абонент знает, сколько параметров было вызвано, чтобы он мог безопасно обращаться к ним? В случае printf() он может анализировать строку формата, но в остальном, как она это делает? – anon
http://en.wikipedia.org/wiki/Stdarg.h –