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 (멋진 벼리님의 이글루)
공부하다가 정리하면서 올렸습니다.
'OS > Windows API' 카테고리의 다른 글
Windows API :: int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 의 의미 (1) | 2016.02.12 |
---|---|
APIENTRY와 CALLBACK의 차이 (0) | 2014.09.27 |
#9 Windows API 더블 버퍼링 (0) | 2014.08.26 |
#8 Windows API (GDI+) 이미지 뿌리기 (0) | 2014.08.26 |
#7 Windows API 선, 사각형, 원 뿌리기 (0) | 2014.08.26 |
댓글
VallistA
병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!
자고 싶습니다. ㅠㅠ
Github :: 링크
궁금한점 문의 주시면 답변드리도록 하겠습니다
VISITED
Today :
Total :
Lately Post
Lately Comment