함수 호출 규약 = 함수를 호출 할 때 파라미터를 어떤 식으로 전달하는가? 에 대한 일종의 약속이다 
(*파라미터란 ? int myung(int a, int b); 이러한식으로 잇을때 int는 리턴형 myung은 함수명이고 괄호안의 int a , int b 가 파라미터(함수 인자) 이다

cdecl , stdcall, fastcall, thiscall 이렇게 4가지 방식이 존재한다 


1.cdecl

주로 C언어에서 사용하고 C언어와 C++프로그램에서 피러미터 전달시 디폴트로 사용오른쪽에서 왼쪽 방향으로 스택에 저장.
파라미터 해제는 프로시저를 호출한 것이 책임진다
caller에서 스택을 정리한다 .
cdecl에 비해서 코드 크기가 작아진다 
가변 길이 파라미터를 전달할 수 있다.


2.stdcall

Win32 API 프로시저 에서 사용한다(GUI) 
(* 프로시저 = 어떤 행동을 수행하기 위한 일련의 작업 순서)
Callee에서 스택을 정리


[*Callee란 ? 
1. 주로 EBX,ESI,EDI에 쓰인다.
2.Caller가 마음대로 사용할 수 있는 레지스터이다.
3.Callee는 이들 레지스터를 사용하기 전에 반드시 백업한 후 사용 해야 하고 이전 함수로 복귀하기 전에 값을 복구해 주어야 합니다. ] 

파라미터 전달은 cdecl과 동일하다 .
c언어에서 stdcall 방식을 사용하고 싶을 때는 함수이름 앞에 '_stdcall'옵션을 추가한다.
파라미터 해제는 프로시저 복귀 전에 이루어져야 한다 .

장점 : 빠른 함수 호출이 가능하다 , 함수 독립성이 뛰어나다 
복귀된 후에 호출한 프로시저에 대하여 신경쓸 필요가 없다
cdecl 방식의 함수 호출 규약에 비해 코드 크기가 줄어든다


3.Fastcall

첫 파라미터 2개를(ECX,EDX)를 이용해 전달한다 나머지는 스택을 통해 오른쪽에서 왼쪽으로 저장한다 .
스택 제거는 stdcall과 동일하다 

장점 : 더 빠른 함수 호출이 가능하다 

단점 : ECX , EDX 레지스터 백업이 필요하거나 함수에서 ECX , EDX를 다른 용도로 써야 할 경우 파라미터를 따로 저장해야한다


아주 간단하게 정리 

cdecl 부모 쪽에서 스택 복구

stdcall 자식 쪽에서 스택 복구

fastcall 레지스터를 통해 인자 전달



'시스템' 카테고리의 다른 글

Cent os 에서 xshell , putty 연동  (0) 2016.05.29
cent os 컴파일러(gcc) 다운  (0) 2016.05.28
스택 프레임  (0) 2016.05.27
쉘과 쉘코드  (0) 2016.05.22
/bin/sh의 의미  (0) 2016.05.22

+ Recent posts