티스토리 뷰

안녕하세요, IT디자이너입니다. 

 

이번 포스팅은 함수 호출 규약에 관하여 설명드리도록 하겠습니다. 

 

소개해드릴 함수 호출 규약은 cdecl,stdcall,fastcall 입니다. 이 함수 호출 규약 말고도 여러가지의 함수 호출 규약이 있지만,

주로 접하게되는 호출 규약으로 설명드리고 나머지 궁금한 호출 규약은 인터넷 검색을 통해 알아보는 것을 권장합니다.

 

 

1. 함수 호출 규약의 개요

함수 호출 규약(Calling Convention)이란, 함수를 호출하는 방식에 대한 약속입니다.

 

  •  종류를 구분하는 방법은

- 인자 전달 순서 ( 왼쪽 인자 -> 오른쪽 인자 or 오른쪽 인자 -> 왼쪽 인자 )

- 인자 전달 방법 ( 스택 or 레지스터 ) 

- Stack Frame을 정리하는 방법 ( 함수 호출자[caller] or 함수 피호출자[callee]

 

예시 코드를 분석해 각 호출 규약의 특징과 진행 과정을 알아보겠습니다. 

 

2. 스택 프레임(Stack Frame)이란

Stack Frame은 함수의 호출 과정에서 호출되는 함수를 사용하기 위해 할당되는 Stack의 공간을 의미합니다. 

프로그램이 실행되면 가장 먼저 Main 함수의 Stack Frame을 할당되며, 

 

Main함수가 A 함수를 호출하면서 스택의 ebp 레지스터 값을 push합니다. push된 ebp 레지스터를 기준으로 스택 프레임을 구분합니다. 

 

Stack Frame에는 함수를 호출 시 매개변수, 함수가 종료될 때 복귀할 명령어의 주소(return address), 이전 Stack Frame의 EBP값을 저장하고, 해당 함수의 지역변수를 저장하기 위한 공간을 할당합니다.

 

 

3. 함수 호출시 스택의 변화

 

main() 함수에서 test(1,2); 로 함수를 호출 하였을 때 스택의 변화입니다. (cdecl 기준), 매개변수 2와 1을 스택 메모리에 담고 eip레지스터(test함수 이후 실행할 코드의 주소)를 백업합니다. 그 후 ebp 레지스터의 값을 백업합니다.

 

 

4. cdecl 함수 호출 규약 

  • 인자 전달 순서 : 가장 오른쪽 인자 -> 가장 왼쪽 인자
  • 인자 전달 방법 : 스택 메모리를 이용한다.
  • 스택  프레임 (Stack Frame) 정리 : Caller(호출자)가 스택 프레임을 정리한다.
  • 가변 인자 사용여부 : 가변인자 사용 가능

※ 가변인자란 printf 처럼 매개변수의 개수가 정해지지 않는 함수를 말합니다. (가변인자는 Caller가 인자를 정리하는 함수 규약에서 사용할 수 있다.)

 

빨간색 표시는 매개변수의 전달 순서를 보여주며, 노랑색은 caller가 esp가 가리키는 스택의 값을 내려서 스택을 해제하는 모습입니다. 

 

 

5. stdcall 함수 호출 규약 

  • 인자 전달 순서 : 가장 오른쪽 인자 -> 가장 왼쪽 인자
  • 인자 전달 방법 : 스택 메모리를 이용한다.
  • 스택  프레임 (Stack Frame) 정리 : Callee(피호출자)가 스택 프레임을 정리한다.
  • 가변 인자 사용여부 : 가변인자 사용 불가능

 

stdcall은 callee가 스택 프레임을 정리합니다. 스택프레임을 정리하면서 전달된 매개변수의 크기만큼 esp의 값을 더해야 하는데 callee는 전달된 매개변수의 크기를 알 수 없기 때문에 가변인자를 사용하는 것이 불가능합니다. 

 

※ 파랑색 표시는 callee 즉, test 함수내에서 스택프레임이 해제되는 어셈블리 코드입니다. 

 

6. fastcall 함수 호출 규약 

  • 인자 전달 순서 : 가장 오른쪽 인자 -> 가장 왼쪽 인자
  • 인자 전달 방법 : EDX, ECX 레지스터를 이용하며 3개의 매개변수 부터는 스택을 사용한다.
  • 스택  프레임 (Stack Frame) 정리 : Callee(피호출자)가 스택 프레임을 정리한다.
  • 가변 인자 사용여부 : 가변인자 사용 불가능

 

사진으로 확인시 매개변수를 직접 레지스터에 저장되는 부분을 확인할 수 있으며, 레지스터의 값을 함수의 지역변수에 복사되는 것을 확인할 수 있습니다. 

 


지금까지 함수 호출 규약에 관하여 간단하게 살펴보았습니다.!!!!!

 

IT디자이너였습니다. 감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함