2010.01.01 00:00 System

출처: http://serious-code.net/moin.cgi/CallingConvention

 Calling Convention?

    함수 호출 방식(Calling Convention)이란 호출자(caller, 피호출자 함수를 호출하는 함수)와 피호출자(callee, 호출자로부터 호출되는 함수) 간에 미리 정해둔, 파라미터의 전달 순서와 사용이 끝난 후의 스택 정리에 대한 규약이라고 할 수 있다. WIN32 환경에서는 기본적으로 세 가지의 호출 방식이 존재한다.

    • Standard Call -- 파라미터들은 코드 상의 오른쪽 파라미터부터 먼저 푸쉬되고(첫번째 파라미터가 스택의 맨 위로 오게 된다는 말이다.), 피호출자(callee)가 스택을 정리한다.

 

    • CDECL or C Calling Convention -- 파라미터들은 코드 상의 오른쪽 파라미터부터 먼저 푸쉬되고(첫번째 파라미터가 스택의 맨 위로 오게 된다는 말이다.), 호출자(caller)가 스택을 정리한다.

 

    • Fast Call -- C++의 내부 구조에 익숙하다면, 멤버 함수를 호출하기 위해서는 this 포인터가 반드시 필요하다는 것을 알 것이다. 일반적으로 이 this 포인터가 스택에 최초로 푸쉬되는 파라미터다. 하지만 이 방식에서는 this 포인터를 스택에다가 푸쉬하는 게 아니라, 레지스터(ECX)에 저장한다. 파라미터들은 코드 상의 오른쪽 파라미터부터 먼저 푸쉬되고(첫번째 파라미터가 스택의 맨 위로 오게 된다는 말이다.), 피호출자(callee)가 스택을 정리한다.

 

    • Pascal Calling Convention -- 이 방식은 더 이상 사용할 수 없다. 이는 모두 Standard Call로 대체되었다. 어쨌든 원래의 Pascal Calling Convention은 파라미터를 코드 상의 왼쪽 것부터 먼저 푸쉬하고, 피호출자(callee)가 스택을 정리한다.

     <!> 결국 파라미터의 전달 순서와 스택 정리에 대한 규약이 다르므로, 다른 규약을 이용해서 만들어진 DLL 안에 있는 함수를 헤더 같은 것도 없이 동적으로 바인딩해서 사용하는 경우, 그것을 컴파일러에게 명시적으로 가르쳐줘야하는 것이다. (호출하는 측과 호출받는 쪽이 다른 Calling Convention을 사용할 수 있으므로...)



                            Calling Conventions Arguments Passing Stack Maintenance Name Decorations Notes
                            __cdecl Right -> Left 호출자가 Stack에서 인자를 제거한다. 함수 이름 앞에 _를 붙인다. Ex) _foo C/C++함수의 기본 호출 규약
                            __stdcall Right -> Left 호출된 함수가 Stack에서 인자를 제거한다. _가앞에 붙고 뒤에 @와 인자의 크기가 10진수로 붙는다. Ex) _foo@12 대부분의 System 함수가 사용. VB에서 내부함수가 사용.
                            __fastcall 첫번째 2개의 DWORD 파라미터는 ECX, EDX 레지스터 사용. 나머지는 Right->Left 호출자가 Stack에서 인자를 제거한다. @이 앞에 붙고 @과 인자의 크기가 10진수로 뒤에 붙는다. Ex) @foo@12 Intel CPU 만 사용. Borland의 Delphi 컴파일러가 사용.
                            this Right -> Left this 매개변수는 ECX 레지스터사용. 호출자가 Stack에서 인자를 제거한다. None C++클래스의 멤버 함수가 사용. COM에서 사용.
                            naked
                            Right -> Left 호출자가 Stack에서 인자를 제거한다. None VxD에서 사용. Custom Prolog 와 Epilog를 만들때 사용.


                          'System' 카테고리의 다른 글

                          [펌]교착 상태와 그 조건  (0) 2010.01.02
                          What is CALLBACK function?  (0) 2010.01.01
                          [펌]함수 호출규약 [Calling Convention]  (0) 2010.01.01
                          Format String Bug  (0) 2009.12.22
                          Reverse Engineering Cheat-Sheet  (0) 2009.11.30
                          What is SVN[Subversion]?  (0) 2009.11.14
                          Posted by LinkC

                          블로그 이미지
                          LinkC

                          태그목록

                          Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

                          공지사항

                          Yesterday49
                          Today12
                          Total323,946

                          달력

                           « |  » 2018.12
                                      1
                          2 3 4 5 6 7 8
                          9 10 11 12 13 14 15
                          16 17 18 19 20 21 22
                          23 24 25 26 27 28 29
                          30 31          

                          최근에 받은 트랙백

                          글 보관함


                          . .