Github avatar

GyeongSu Han's Github Pages

함수 호출 규약

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)가 한다.