본문 바로가기

프로그래밍

함수 호출 규약

반응형

▣ 함수 호출 규약(Calling Convension)

 

함수가 프로그램 내에서 호출되는 방식을 함수호출규약이라고 한다.

C에서 똑같은 함수를 사용하더라도 호출 규약 방식이 다르면 인자 전달 방식의 차이가 있다.

 

호출 규약의 종류는 다음과 같다.

 

▶ cdecl(C declaration)

o 인자를 오른쪽에서 왼쪽으로 스택에 넣고 , Caller에서 스택을 정리한다.

 

예시)

C에서 __cdecl 방식으로 main함수에서 func(5,10) 함수를 호출했을 때

 

(assemble)

push 10       <----- -4
push 5        <----- -4
call func(..)     
add esp,8     <----- +8(스택정리)

 

 

 

오른쪽 인자인 10이 먼저 스택에 들어가게 되고 , 그 다음 왼쪽 인자인 5가 push된다.

그리고 받은 인자값(2개)만큼 caller인 main에서 스택을 정리하게 된다.

 

 

▶ stdcall(standard call)

o 인자를 오른쪽에서 왼쪽으로 스택에 넣고 , Callee에서 스택을 정리한다.

함수를 정리하기 위해 RET를 사용하게되며 , 

스택에서 정리할 바이트 수를 나타내는 인자와 같이 사용된다.

(레지스터의 반환값은 EAX에 저장한다)

 

인자의 값을 4로 나눈것이 파라미터의 수가 되며

만약 RET 16일 경우 16/4 = 4개의 파라미터로 판단할 수 있다.

 

 

 

▶ fastcall 
o 인자를 오른쪽에서 왼쪽으로 스택에 넣고 , Callee에서 스택을 정리한다.

 

stdcall과 차이점은 최초의 인자 두 개는 레지스터(ECX,EDX)를 이용하여 전달하고

세 번째부터는 스택을 이용하여 전달한다.

 

예시)

C에서 __fastcall 방식으로 main함수에서 func(5,10,15) 함수를 호출했을 때

 

(assemble)

mov edx , 10     
mov ecx , 5      
push 5
call func(...)

 

연산이 빠른 레지스터를 이용하기 때문에 fastcall이라고 유래된다.
반응형