OS/Windows API

__stdcall과 __cdecl의 차이점

VallistA2014. 9. 27. 11:22

함수를 규약할때 여러가지 방법이 존재하는데, 이 규약들은 여러가지 방법을 내포합니다.

총 5가지로 이루어져 있으며, 그것들에는 무엇이있냐.


__stdcall

__cdecl

this

__fastcall

naked


로써 5개가 존재합니다.


이중에서 우리가 제일, 자주 사용하는 2가지 함수의 규약에 대해 설명하고자 합니다.


 __stdcall (standard call) 

 -> __stdcall 규약을 따를경우 함수를 호출한 쪽에서 패러미터값을 return이 되고 난 후 stack 메모리영역에서 삭제합니다. 

     호출한 함수가 자신의 패러미터값을 아는 상태이기 때문에 printf같은 가변적인 함수에서 사용하게 됩니다.


 __cdecl (C delcaration)

 -> 이 규약을 따를경우 __stdcall과 반대로 호출 받은 쪽의 패러미터를 제거하도록 합니다. 

     패러미터의 갯수가 명확한 곳에서 사용을 합니다. 윈도우즈 API와 같은 경우 함수에 따른 인자들이 명확히 정의되어 있기때문에 이 규약을 사용합니다.


__stdcall 인 경우, 함수를 호출당한 루틴이 얼만큼을 stack에서 이동해야 하는지를 알아야 하기 때문에 __stdcall는 아래와 같이 정의되어 있습니다.


 _Foo@12


Foo 는 함수 이름이며 12는 스택 포인터를 옮겨 주어야 할 값이며, 이렇게 명시적으로 되어 있어야, 호출당한 쪽에서 알 수 있습니다.

그럼 실제로 assembly 에서 어떤 일이 일어나는지 보도록 합시다.




출처 : http://qufl1999.egloos.com/viewer/2338204 (멋진 벼리님의 이글루)

공부하다가 정리하면서 올렸습니다.

댓글

댓글쓰기 폼

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.

자고 싶습니다. ㅠㅠ

페이스북    :: 링크
카카오톡    :: kingbye1
Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today : 14

Total : 396,619

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘