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  


+ Recent posts