튜기's blogggg

함수호출규약

by St1tch


1. 함수 호출 규약 개요

함수 호출 규약(Calling Convention)이란, 함수를 호출하는 방식에 대한 약속이다. 함수 호출 규약은 인자 전달 방법, 인자 전달 순서, Stack Frame을 정리하는 방법에 따라 그 종류를 구분한다. 예시 코드를 분석해 각 호출 규약의 특징과 진행 과정을 알아본다.

 

▶Stack Frame

함수를 호출 할 때 상위에서 진행하던 함수의 정보를 저장하고 인자를 전달하기 위해 Stack Frame이라는 구조를 사용한다.

 







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

프로그램이 실행되면 가장 먼저 Main 함수의 Stack Frame을 할당한다. Main함수가 A 함수를 호출하면서 A의 Stack Frame을 할당하고, 다시 A 함수 내에서 B함수를 호출하면 B의 Stack Frame을 할당한다.

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

 

 

▶함수 호출 규약의 구분 방법

인자 전달

인자 전달의 순서 (왼쪽 인자부터 / 오른쪽 인자부터)

인자 전달에 사용하는 매체 (Stack / 레지스터)

Stack Frame

정리 방법

Caller를 이용한 정리

Callee를 이용한 정리

▲함수 호출 규약의 구분 방법

※Caller와 Callee

Caller : 다른 함수를 호출 한 함수

Callee : 호출을 당한 함수

 

 

▶함수 호출 규약의 종류

규약

인자 전달 순서

인자 전달 매체

Stack를 정리하는 함수

cdecl

Stack

Caller

stdcall

Stack

Callee

fastcall

레지스터 + Stack

Callee

    ▲주요 함수 호출 규약

이외에도 clrcall, thiscall, pascal, syscall, fortran등의 규약이 존재한다.

 

 

▶함수 호출 시 Stack의 변화 순서

 

    ▲함수 호출 시 Stack의 변화 순서

 

 

 

 

 

 

2. cdecl

2-1. cdecl 개요

 

인자 전달 순서

가장 오른쪽 인자부터 전달한다. ()

인자 전달 매체

Stack 을 사용한다.

Stack Frame 정리 방법

함수를 호출한 Caller가 인자를 정리한다.

C언어와 C++에서의 표준 함수 호출 규약이다. Caller가 인자를 정리하는 규약이므로, 가변인자를 사용할 수 있다.

    ▲cdecl의 개요

※가변 인자 : printf와 같은 함수를 호출할 때, 인자의 개수를 미리 정해두지 않고 사용한다. 따라서 인자의 숫자에 제한이 없다. 이를 가변 인자라고 하며, Caller가 인자를 정리하는 함수 규약에서 사용할 수 있다.

 

 

2-2. 소스 코드

 

      ▲cdecl 소스 코드

분석에 사용될 프로그램의 소스 코드이다. cdecl_Test 함수를 호출하고, 전달받은 인자들의 합 nSum을 return한다.

 

 

    2-3. 어셈블리 코드

 

 

 

3. stdcall

3-1. stdcall 개요

 

인자 전달 순서

가장 오른쪽 인자부터 전달한다. ()

인자 전달 매체

Stack 을 사용한다.

Stack Frame 정리 방법

호출을 당한 Callee가 함수를 종료하면서 인자를 정리한다.

Window API, Visual Basic에서 사용하는 표준 규약이다. 코드가 간결하지만 가변 인자를 사용할 수 없다.

    ▲stdcall의 개요

 

 

3-2. 소스 코드

 

    ▲stdcall 소스 코드

분석에 사용될 프로그램의 소스 코드이다. stdcall_Test 함수를 호출하고, 전달받은 인자들의 합 nSum을 return한다.

 

 

3-3. 어셈블리 코드

 

 

 

4. fastcall

4-1. fastcall 개요

 

인자 전달 순서

가장 오른쪽 인자부터 전달한다. ()

인자 전달 매체

ECX, EDX, Stack 순서로 사용한다. 보통은 2개의 인자만 사용한다.

Stack Frame 정리 방법

호출을 당한 Callee가 함수를 종료하면서 인자를 정리한다.

Delphi 개발 툴의 기본 규약이다. 인자 전달에 레지스터를 사용하므로, 속도가 빠른 장점이 있다. 주로 2개의 인자를 사용하며, 인자가 3개 이상이면 Stack을 함께 사용해 인자를 전달한다.

    ▲fastcall의 개요

 

 

4-2. 소스 코드

 

    ▲fastcall 소스 코드

분석에 사용될 프로그램의 소스 코드이다. fastcall_Test 함수를 호출하고, 전달받은 인자들의 합 nSum을 return한다

 

 

4-3. 어셈블리 코드


 

 

 


블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기