6

От: 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 параметры из стека поэтому возвращающей указатель стека ...?

Другой вопрос:

Теоретически, можно было бы реализовать различные функции параметров с вызываемым заботясь о праве очистки (например, если вы передаете количество аргументов в стеке в реестре)?

ответ

19

Потому что, с помощью соглашения о вызове C, вызываемая функция будет не поп параметров. Вот в чем смысл этого соглашения.

Это позволяет использовать переменные аргументы.

+0

Точно. С помощью функций C вызывающий может вызывать столько аргументов в стеке, сколько ему нравится, прежде чем вызывать функцию. Вызываемая функция просто не знает, сколько должно быть очищено. –

+1

Каким образом вызывающий абонент знает, сколько параметров было вызвано, чтобы он мог безопасно обращаться к ним? В случае printf() он может анализировать строку формата, но в остальном, как она это делает? – anon

+0

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

6

Он был там на странице википедии выше _cdecl заголовка

В этих конвенциях вызывающие убирают аргументы из стека, что позволяет для переменных списков аргументов, например. Е().