x86에서는 cdecl, stdcall, fastcall 3개의 함수 호출 규약을 사용합니다.
cdecl 은 caller에서 스택을 정리합니다. 파라미터를 오른쪽에서 왼쪽으로 밀어 넣으며, 장점은 가변 파라미터를 전달할 수 있습니다. 함수명 앞에 _ 가 추가되어 알아볼 수 있습니다.
stdcall 은 cdecl 의 반대 개념입니다. 함수에서 스택을 정리하고 빠져나옵니다. 파라미터를 오른쪽에서 왼쪽으로 넣으며, 장점은 코드의 길이가 짧아집니다. 함수명 앞에 _ 가, 뒤에 @ 가 추가되어 알아볼 수 있습니다.
fastcall 은 기본적으로는 stdcall과 같습니다. 하지만 처음 두 파라미터는 ecx, edx 에 넣고 나머지는 오른쪽에서 왼쪽으로 파라미터를 전달합니다. 장점은 빠른 함수 호출입니다. 스택 정리는 callee에서 합니다. 함수명 앞 뒤로 @ 가 추가되어 알아볼 수 있습니다.
하지만 x64에서는 변형된 fastcall 방식만 사용합니다.
x86에서의 fastcall 은 ecx, edx 두개의 레지스터에 저장하고 그 후 나머지는 오른쪽에서 왼쪽으로 밀어넣습니다.
하지만 x64에서 이용하는 fastcall은 4개의 레지스터까지 저장합니다.
rcx, rdx, r8, r9 순입니다.