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 

왜 우리가 명시 적으로 호출 된 함수 따라서 스택 포인터를 복원 스택에서 매개 변수를 poped해야하기 때문에 스택을 취소 ESP에 12를 추가해야합니까 ...?

또 다른 질문 : 이론적으로

, (당신이 레지스터의 스택에 인수의 수를 전달하는 경우 예를 들어) 정리를 잘 돌보는 호출 수신자와 변수 매개 변수 기능을 구현 할 수 있을까요?

답변

19

C 호출 규칙을 사용하면 호출 된 함수가 이 아니기 때문에 매개 변수를 팝합니다. 그것이 바로이 협약의 핵심입니다.

가변 인수와 같은 것을 허용합니다.

+0

정확히. C 함수를 사용하면 호출자는 함수를 호출하기 전에 원하는만큼 스택에 많은 인수를 푸시 할 수 있습니다. 호출 된 함수는 얼마나 많은 객체를 정리해야하는지 알지 못합니다. –

+1

피 호출자는 안전하게 호출 할 수 있도록 얼마나 많은 매개 변수가 호출되었는지 어떻게 알 수 있습니까? printf()의 경우 형식 문자열을 구문 분석 할 수 있지만 그렇지 않은 경우 어떻게 처리합니까? – anon

+0

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

6

IT는 _cdecl 헤더 호출자가 예를 들어, 변수 인수 목록을 허용 스택에서 인수를 청소 이러한 규칙에서

위의 위키 피 디아 페이지에 바로 거기에 있었다. printf().