=== Win32의 콜링 컨벤션(Calling Conventions;호출 규약) === 스택을 이용하여 인자(argument)를 전달할 때 스택에 인자를 어떤 순서로 넣을 것이며 전달된 인자를 어느 곳에서 해제할 것인가를 결정하는 규약. {{{+1 이 문서에서 가장 중요한 부분: __stdcall과 __cdecl의 차이점 }}} === __stdcall (standard call) === 함수 내부에서 스택을 정리한다. 함수 내부에서 인자를 바로 ret 하면서 정리하기 때문에 stdcall이 cdecl 보다 빠르고 바이너리 사이즈가 좀 더 작다. cdecl은 ret 후 인자를 정리하는 별도의 코드가 필요하다. 함수 독립성이 뛰어나므로 DLL을 만들 때는 반드시 stdcall로 선언해야 한다. 함수 이름 앞에 _가 붙으며 뒤에 @가 붙은 후 인수 목록의 바이트 수가 붙는다. === __cdecl (C declaration) === (유일하게 cdecl만) 함수를 호출한 쪽에서 스택을 정리한다. 인자를 정리하려면 인자가 몇 개인지 알아야 하는데 따라서 인자가 불분명한 가변인자는 cdecl에서만 지원한다. C와 가변인자를 사용하는 C++ 함수의 기본 호출 규약. 함수 이름 앞에 _가 붙는다. 기본 호출 규약에 대한 VC++ 컴파일러 옵션 - /Gz (stdcall), /Gr (fastcall), /Gd (cdecl) {{{+1 기타 콜링 컨벤션 }}} === __fastcall === 처음 두 개까지의 DWORD 인자는 스택을 사용하지 않고 ECX와 EDX 레지스터를 사용한다. 이름 장식은 함수 이름 앞에 @가 붙으며 나머지는 stdcall과 같다. 인텔 CPU에서만 적용되고 볼랜드 컴파일러의 기본 호출 규약이다. === thiscall === 가변인자를 사용하지 않는 C++의 기본 호출 규약. ECX 레지스터에 this 포인터를 넣는다. 컴파일 시 가변인자인 경우 cdecl로 변경된다. 기본적으로 C++ 멤버 함수는 thiscall을 사용한다. === naked === 이름 장식을 하지 않는 것을 빼면 cdecl과 같다. VxDs에서만 사용한다. 참고 ---- http://www.cs.cornell.edu/courses/cs412/2001sp/resources/microsoft-calling-conventions.html http://www.unixwiz.net/techtips/win32-callconv.html ---- CategoryDocument