▣ 함수 호출 규약(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(...) |
|
'프로그래밍' 카테고리의 다른 글
오토핫키 매뉴얼 (0) | 2018.05.10 |
---|---|
ELK 스택 (Elasticsearch,Logstash,kibana) 구축 (0) | 2017.12.12 |
Visual Studio 관리자 권한으로 프로그램 실행 (0) | 2017.06.24 |
Visual Studio 유용한 기능 (0) | 2017.06.06 |
_tsetlocale (한글출력) (0) | 2017.06.06 |