공부,일/어셈블리
__cdecl vs __stdcall
fromnothing1
2021. 8. 13. 14:09
1. __cdecl
스택에 쌓은 피라미터를 호출한함수에서 제거
#include <stdio.h>
int __cdecl cdeclFunction(int a, int b)
{
return a + b;
}
int main()
{
int varA = 1, varB = 2;
cdeclFunction(1, 2);
return 0;
}
즉 위의 코드를 보면 main 함수에서 cdeclFuction 을 call 한후에 main 함수 내에서
esp(스택포인터) 를 관래해준다. ( cdeclFuction 사용한 스택 clear)
2. __stdcall
스택을 call 한 함수 안에서 정리를 해준다. 즉 stdcallFunction 안에서 정리를 해준다.
#include <stdio.h>
int __stdcall stdcallFunction(int a, int b)
{
return a + b;
}
int main()
{
int varA = 1, varB = 2;
cdeclFunction(1, 2);
return 0;
}
상세
사실 위의 설명을 보면 별 차이가 없다 결국 어디서 스택을 정리하는지 차이지 별차이가 없어 보인다.
하지만 결정적인 차이가 2가지 존재한다.
1. 가변인자 사용 stdcall 의 경우 call 된 함수 내에서 스택을정리하기 때문에 가변인자를 사용할 경우 얼마나 정리해야 하는지 몰라서 가변인자를 사용할 수 없다.
하지만 cdecl 의 경우 가변인자를 넘겨주는 main 함수안에서 스택을 정리하기 때문에 얼마만큼의 스택을 정리해야하는지 알고있기 때문에 가변인자를 사용할 수 있다.
2. stdcall 은 표준이다.
다른 프로그램 언어와 호환을위해서는 표준이 있어야 하는데 stdcall 함수가 표준으로 정해져 있기 때문에 호환을 위해서는 stdcall 함수를 사용해야 한다.