Почему вызывающая сторона должна очистить стек в соглашении о вызовах cdecl? - PullRequest
6 голосов
/ 08 октября 2009

От: 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

Почему нам нужно явно добавить 12 в ESP для очистки стека, поскольку вызываемая функция должна была вытолкнуть параметры из стека, восстанавливая указатель стека ...?

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

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

Ответы [ 2 ]

19 голосов
/ 08 октября 2009

Поскольку с соглашением о вызовах C вызываемая функция не извлекает параметры. В этом смысл этого соглашения о вызовах.

Это допускает такие вещи, как переменные аргументы.

6 голосов
/ 08 октября 2009

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

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

...