관리 메뉴

c0smicb0y

Calling Convention (호출규약) 본문

프로그래밍/Windows

Calling Convention (호출규약)

2015. 11. 4. 02:06

스택을 이용하여 파라미터를 전달할 때 스택에 파라미터를 어떠한 순서로 넣을 것이며 또한 전달되어진 파라미터를 어느 곳에서 해제할 것인가에 따라 여러 가지 방식이 잇으며, 이를 Calling Convention(호출규약)이라고 부른다.


__cdecl

이 Calling Convention은 C, C++ 프로그램에서 파라미터 전달 시 기본적으로 사용되는 방식으로, 파라미터 전달은 오른쪽에서 왼쪽으로 이루어지며, 프로시저를 호출한 쪽(Caller)에서 파라미터에 대한 해제까지 책임져주게 된다.


1
2
3
4
5
6
7
8
main(){
    sum(12);
}
 
int sum(int a, int b)
{
    return a + b;
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
main:
    push 2
    push 1
    call sum
    add esp, 8
sum:
    push ebp
    mov ebp, esp
    mov eax, dword ptr [ebp + 0x8]
    add eax, dword ptr [ebp + 0xc]
    pop ebp
    ret
cs


main 어셈블리 코드에서 call sum 이후 add esp, 8로 파라미터에 대한 해제까지 해주는 것을 볼 수 있다.


__stdcall

Windoiws API의 프로시저에서 사용하는 Calling Convention으로 파라미터 전달은 __cdecl 방식과 동일하게 오른쪽에서 왼쪽 방향이지만, 파라미터의 해제는 프로시저가 복귀되기 전에 Callee에 의해 이루어진다.

1
2
3
4
5
6
7
8
main(){
    sum(12);
}
 
int __stdcall sum(int a, int b)
{
    return a + b;
}
cs


1
2
3
4
5
6
7
8
9
10
11
main:
    push 2
    push 1
    call sum
sum:
    push ebp
    mov ebp, esp
    mov eax, dword ptr [ebp + 0x8]
    add eax, dword ptr [ebp + 0xc]
    pop ebp
    ret 8
cs

sum의 내부 루틴에서 ret 8을 통해 파라미터의 해제가 이루어지고 있다.

__fastcall
__fastcall은 처음 두 개의 파라미터까지는 스택을 사용하지 않고 ecx와 edx 레지스터를 사용하며 그 이상의 파라미터에 대해서는 오른쪽에서 왼쪽 방향으로 스택에 저장한다. 파라미터의 해제는 __stdcall과 동일하다.


'프로그래밍 > Windows' 카테고리의 다른 글

Child Process를 디버깅하는 방법  (0) 2015.11.21
VC 컴파일러 환경 변수 설정  (0) 2015.11.13
함수에서의 레지스터 사용  (0) 2015.11.04
ShellExecute vs CreateProcess  (0) 2015.10.02
Comments