함수 호출 규약
Jun 29, 2015 · Computer Structure
기본적으로 함수 호출시 매개변수를 부를 때 뒤에 있는 인자 부터 부른다.
(컴파일러 마다 다름. 컴파일러 최적화에 의해 다른 순서로 불릴수 있다.)
stdcall (Standard Call)
- Windows API Default Call
-
스택 정리를 콜리(Callee)가 한다.
- 함수 호출시 사용한 매개변수를 부른 곳(부른 함수의 메모리)이 아닌 불려진 곳(매개변수를 사용하는 함수)에서 정리하고 함수가 끝난다.
-
가변 형태 지원 불가
- 매개변수의 갯수가 정해진 함수이기 때문에 printf와 같이 인자의 수가 변하는 함수에서는 사용 할 수 없다.
cdecl
- C/C++ Default Call
-
스택 정리를 콜러(Caller)가 한다.
- 함수 호출시 사용한 매개 변수를 부른 곳(함수를 사용하는 메모리)에서 정리한다.
-
가변 형태 지원.
- 인자 수가 변할 수 있는 형식의 함수를 지원한다.
- ex) printf, scanf …
fastcall
-
매개변수 2개까지는 스택이 아닌 레지스터(ecx, edx)에서 처리한다.
- ex) int __fastcall test(int a, int b, int c)의 함수를 호출 할 경우 a와 b의 값은 레지스터에서 처리하고, c의 값은 스택으로 처리한다.
- 스택정리를 콜러(Caller)가 한다.