함수 호출 규약이란 함수 호출자(Caller) 와 함수 피호출자(Callee) 간에 함수를 호출할 때 전달되는 파라미터의 순서나 사용이 끝나고 나서 스택 정리 등에 관한 규약입니다.

대표적으로 cdecl, stdcall, fastcall 이 있습니다.

cdecl 은 caller에서 스택을 정리합니다. 파라미터를 오른쪽에서 왼쪽으로 밀어 넣으며, 장점은 가변 파라미터를 전달할 수 있습니다. 함수명 앞에 _ 가 추가되어 알아볼 수 있습니다.

stdcall 은 cdecl 의 반대 개념입니다. 함수에서 스택을 정리하고 빠져나옵니다. 파라미터를 오른쪽에서 왼쪽으로 넣으며, 장점은 코드의 길이가 짧아집니다. 함수명 앞에 _ 가, 뒤에 @ 가 추가되어 알아볼 수 있습니다.

fastcall 은 기본적으로는 stdcall과 같습니다. 하지만 처음 두 파라미터는 ecx, edx 에 넣고 나머지는 오른쪽에서 왼쪽으로 파라미터를 전달합니다. 장점은 빠른 함수 호출입니다. 스택 정리는 callee에서 합니다. 함수명 앞 뒤로 @ 가 추가되어 알아볼 수 있습니다.

프롤로그, 에필로그는 함수 호출 시 시작 부분에서 시작되는 코드는 프롤로그, 함수의 끝 부분에서 실행되는 부분은 에필로그 라고 부릅니다.


프롤로그

프롤로그는 함수가 호출될 때 실행되며, 함수가 필요로 하는 스택 프레임 메모리를 설정합니다.

callee 의 프롤로그는 아래와 같습니다.

push ebp
mov ebp, esp

에필로그

함수 실행에 사용된 스택 프레임을 정리하는 역할을 합니다.

함수 수행을 마치고 다시 처음 호출된 지점으로 돌아가기 위하여 스택을 복원합니다.

callee 의 에필로그는 아래와 같습니다.

leave
let