336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
[_cdecl ] 마지막 인자부터 스택에 저장하며, 함수를 호출한 쪽에서 스택을 정리한다
[_stdcall] 마지막 인자부터 스택에 저장하며, 호출된 함수가 스택을 정리한다(Win32 API)
[_fastcall] 레지스터에 인자 두 개를 넣고, 마지막 인자부터 스택에 저장하며 호출된 함수가
스택을 정리한다
_stdcall 은 보통 API들이 사용하고 있다. 그 이유는 스택을 정리하는 코드가 API 쪽에 있게 되면 그 만큼 메모리를 절약할 수 있기 때문이다
* 예제 코드
1. _cdecl
C++
void _cdecl Func( int a, int b, int c, int d) { return; } void main() { Func( 1, 2, 3, 4); } |
Assembly
; 12 : Func( 1, 2, 3, 4); 00000 6a 04 push 4 00002 6a 03 push 3 00004 6a 02 push 2 00006 6a 01 push 1 00008 e8 00 00 00 00 call ?Func@@YAXHHHH@Z 0000d 83 c4 10 add esp, 16 ; 함수 호출부분만 보면 모두 스택에 넣고 호출 후 제거 |
2. _stdcall
C++
void _stdcall Func( int a, int b, int c, int d) { return; } void main() { Func( 1, 2, 3, 4); } |
Assembly
// Func의 반환부분 // "ret 16”은 "add esp,16" "ret 0”과 같음 00000 c2 10 00 ret 16 ; 00000010H // 함수 호출부분 4개의 인자를 스택에 쌓고 제거하지 않는다 00000 6a 04 push 4 00002 6a 03 push 3 00004 6a 02 push 2 00006 6a 01 push 1 00008 e8 00 00 00 00 call ?Func@@YGXHHHH@Z ; Func |
3. _fastcall
C++
void _fastcall Func( int a, int b, int c, int d) { return; } void main() { Func( 1, 2, 3, 4); } |
Assembly
// Func의 반환부분 나머지 두 개는 레지스터에 있다 00000 c2 08 00 ret 8 // 함수 호출부분 // 2개의 인자를 스택에 쌓고, // 2개는 레지스터에 넣는다 // 역시 스택을 제거하지 않음 00000 6a 04 push 4 00002 6a 03 push 3 00004 ba 02 00 00 00 mov edx, 2 00009 b9 01 00 00 00 mov ecx, 1 0000e e8 00 00 00 00 call ?Func@@YIXHHHH@Z ; Func |
'Programming > Windows programming' 카테고리의 다른 글
MFC CString 사용시 strtok (0) | 2009.07.31 |
---|---|
OpenCV, IplImage Picture Control에 출력 시키기 (0) | 2009.07.20 |
OpenCV MFC용 이미지 클래스 (0) | 2009.07.16 |
하나의 에디트박스에 두개의 스핀컨트롤러 사용하기 (0) | 2009.06.11 |
PreTranslateMessage (0) | 2009.05.29 |