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 함수를 사용해야 한다.
'공부,일 > 어셈블리' 카테고리의 다른 글
| 튜토리얼 2(메세지 박스 만들기) (0) | 2021.08.15 |
|---|---|
| 튜토리얼 1 (0) | 2021.08.13 |
| masm32 기본 다지기 튜토듀얼 블로그 (0) | 2021.08.13 |
| visual studio 에서 masm32( 어셈블러) 사용하기 (0) | 2021.08.13 |
| ch3 assembly language statements (0) | 2021.08.12 |
댓글