함수 호출 규약 ( Calling Convenfion ) 란?


- 함수를 호출 할 때 피라미터를 어떤식으로 전달 하는가에 대한 일종의 규약이라고 할 수 있다.


  함수 호출 전에 파라미터를 스택을 통해 전달 한다. 


  프로세스가 실행 될 때 스택메모리의 크기가 결정된다.


  스탯에 저장된 값은 임시로 사용하는 값이기 때문에 더 이상 사용하지 않는다고 하더라도 값을 지우거나 하면 불필요하게 CPU자   원을 소모하게 된다.


  함수 호출후에 ESP(스택 포인터)를 어떻게 정리하는지에 대한 약속이 바로 함수 호출 규약이다.




 1. 파라미터 전달 방법


     - 스택프레임 사용하여 파라미터 전달, 레지스터 사용해서 파라미터 전달


 2. 파라미터 전달 순서


     - 함수 파라미터가 2개 이상일때 어떤 파라미터부터 먼저 전달 할 것인가?


 3. 함수 리턴 값 전달 방법 


     - 함수 리턴 값을 어디에 저장해서 돌려줄 것인가?


 4. 함수 호출간 사용 했던 스택프레임을 정리하는 방법


     - 함수 호출이 끝난후에 사용 했던 스택프레임을 공간을 누가 정리할 것인가?






함수 호출 규약의 종류


 __cdecl


   - C언어에서 만든 표준 호출 규약이다. 파라미터는 오른쪽에서 왼쪽으로 스택프레임을 통해 전달되며, 호출한 곳에서 스택프레임을 정리한다. 특징적인건 호출한 쪽에서 스택프레임을 정리하기 때문에 가변인자를 지원 한다는것이다. 




     파라미터 전달 방법 : 스택프레임 사용하여 파라미터 전달 파라미터의 개수는 제한이 없다.


     파라미터 전달 순서 : 오른쪽 파라미터 -> 왼쪽 파라미터 ex) Func(1,2,3) 3,2,1 순으로 스택에 Push


     함수리턴 값 전달 방법 : 리턴 겂이 4byte 이하 - EAX 8byte 이하 - 상위 4byte는 EDX 하위 4byte는 EAX 


     스택프레임 정리 방법 : 호출한 함수(caller)가 호출된 함수(callee)의 스택프레임공간을 정리한다.(가변인자 지원 o) 


  


__stdcall

   - 윈도우 API에서 만든 표준 호출 규약이다. 파라미터는 오른쪽에서 왼쪽으로 스택프레임을 통해 전달 되며, 스택프레임 정리는 호출 당한 곳에서 이루어 진다. 가변인자가 없고 매개변수가 고정이기 때문에 호출 당한 곳에서 정리가되며 효율적이다.


 


     파라미터 전달 방법 : 스택프레임 사용하여 파라미터 전달 파라미터의 개수는 제한이 없다.


     파라미터 전달 순서 : 오른쪽 파라미터 -> 왼쪽 파라미터 ex) Func(1,2,3) 3,2,1 순으로 스택에 Push


     함수리턴 값 전달 방법 : 리턴 겂이 4byte 이하 - EAX 8byte 이하 - 상위 4byte는 EDX 하위 4byte는 EAX 


     스택프레임 정리 방법 : 호출된 함수(callee)가 자신의 스택프레임공간을 직접 정리한다. (가변인자 지원 x) 




__fastcall

   - 윈도우 API에서 만든 표준 호출 규약이다. 파라미터는 오른쪽에서 왼쪽으로 스택프레임을 통해 전달 되며, 스택프레임 정리는 호출 당한 곳에서 이루어 진다. 가변인자가 없고 매개변수가 고정이기 때문에 호출 당한 곳에서 정리가되며 효율적이다.


 


     파라미터 전달 방법 : 처음 2개의 파라미터는 스택프레임을 사용하지 않고 ECX와 EDX 레지스터를 사용해 파라미터를 전달


     파라미터 전달 순서 : 오른쪽 파라미터 -> 왼쪽 파라미터 ex) Func(1,2,3) 3,2,1 순으로 스택에 Push


     함수리턴 값 전달 방법 : 리턴 겂이 4byte 이하 - EAX 8byte 이하 - 상위 4byte는 EDX 하위 4byte는 EAX 


     스택프레임 정리 방법 : 호출된 함수(callee)가 자신의 스택프레임공간을 직접 정리한다.  (가변인자 지원 x) 


__thiscall

직접적으로 함수 호출 규약으로 사용할 수는 없다. 이 호출 규약은 C++의 클래스 멤버 함수 호출 규약으로 사용된다. 파라미터는 오른쪽에서 왼쪽으로 스택을 통해서 전달되고, 호출 당한 곳에서 스택을 정리한다. 특징적 인건 ecx를 통해서 클래스 포인터를 전달하는 점이다.


     파라미터 전달 방법 :  ??


     파라미터 전달 순서 : 오른쪽 파라미터 -> 왼쪽 파라미터 ex) Func(1,2,3) 3,2,1 순으로 스택에 Push


     함수리턴 값 전달 방법 : ??


     스택프레임 정리 방법 : 호출된 함수(callee)가 자신의 스택프레임공간을 직접 정리한다. (가변인자 지원 x) 


     특징 : ecx를 통해서 this 포인터를 전달 함


+ Recent posts