본문 바로가기

CS

스택 프레임과 함수 호출 규약

함수 호출 규약은 함수 호출 시에 인자 전달, 반환 값 처리, 스택 프레임 관리 등의 방식을 규정하는 규칙이며, 이러한 규칙에 따라 스택 프레임이 구성된다.

 

스택 프레임 함수가 호출될 때 함수 내에서 사용되는 정보들을 저장하는 메모리 영역이다.

즉, 함수가 호출되면서 생기는 해당 함수와 관련된 메모리 덩어리가 스택 프레임이며 이러한 스택 프레임은 Stack 영역에 저장된다.

 

스택 프레임은

1. 매개변수를 저장하는 공간

2. 로컬변수를 저장하는 공간

3. 이전 프레임의 포인터 (이전 스택 프레임의 데이터를 참조하기 위한 포인터이다.)

4. 반환 주소 (함수 실행이 끝나면 제어권을 넘길 복귀 주소를 저장한다.)

스택 프레임과 함수 호출 규약

1. 함수 호출 규약에 의해 함수 호출 시에 함수에 전돨되는 인자들이 어떠한 방식으로 스택에 배치될지 결정된다.

2. 함수 내 지역 변수들은 주로 스택 프레임 안에 저장된다. 함수 호출 시에 호출 규약에 따른 스택 프레임이 생성된다.

함수가 반환되면 스택 프레임이 제거되며 그 안에  지역 변수도 제거 된다.

3. 호출된 함수의 실행이 끝나면, 호출 지점으로 제어가 복귀한다. 그리고 호출 규약에 의해 함수의 반환 주소가 저장되는 방식이 결정된다.

 

함수 호출 규약

cdecl

1. 인자를 오른쪽에서 왼쪽 순서로 스택에 전달한다.

2. 인자 전달 시에 스택 메모리를 사용한다.

3. 함수의 반환 시 호출자가 스택 프레임을 정리한다.

4. 가변 인자 사용 가능하다.

c언어에서 주로 사용

 

표준 호출 규약 (stdcall)

1. 인자를 왼쪽에서 오른쪽 순서로 스택에 전달한다.

2. 인자 전달 시에 스택 메모리를 사용한다.

3. 함수의 반환 시 호출된 해당 함수가 스택 프레임을 정리한다.

4. 가변인자 사용이 불가능하다.

 

이름 없는 호출 규약 (fastcall)

1. 인자를 오른쪽에서 왼쪽 순서로 스택에 전달한다.

2. 인자 전달 시에 EDX, ECX 레지스터에 인자를 전달하고 3번째 인자부터 스택에 전달한다.

3. 함수의 반환 시 호출된 해당 함수가 스택 프레임을 정리한다.

 

'CS' 카테고리의 다른 글

메모리 계층 구조와 페이징 기법  (0) 2024.11.02
B-Tree  (0) 2024.04.29
메모리 단편화  (0) 2024.04.22
TLS  (0) 2024.04.22