함수 호출 규약 - cdecl) 복습을 위해 작성하는 글 2023-11-03

rizz·2023년 11월 2일
0

C

목록 보기
18/25

📒 함수 호출 규약 - cdecl

📌 레지스터

ESP: 스택의 마지막 값의 주소를 가리킨다.

EIP: 다음에 실행할 기계어의 메모리 위치를 저장

EBP: EBP가 가리키는 지점이 스택 프레임의 베이스, EBP가 가리키고 있는 지점을 기준으로 얼마만큼의 byte를 더하여 파라미터, 리턴값 등에 접근할 수 있다.

EAX(범용 레지스터): 리턴값을 임시로 보관

 

📌 함수 실행 과정

1. 인자를 스택에 넘김(뒤 파라미터부터)

2. 함수를 호출한 대상의 주소를 스택과 EIP에 저장(복귀 주소)

3. EIP의 값이 함수의 기계어가 있는 주소로 변경

4. EBP의 값을 스택에 저장

5. ESP가 가리키고 있는 현재 지점을 EBP의 값으로 저장

6. 함수 리턴 값이 스택에 저장, EAX에도 저장

7. 해당 함수를 실행한 함수의 스택 프레임의 EBP를 복구(주소값 복구) - 리턴 시작 스택 프레임을 pop하기 시작

8. 복귀 주소를 EIP로 복구 - 함수를 호출했던 함수로 복귀

9. 스택에 쌓였던 파라미터 제거

10. EAX에 있던 반환 값을 스택에 push

 

💡 TIP

fastcall, sdcall, diskcall 등의 다른 규약도 존재

규약마다 스택 정리를 콜러 또는 콜리가 하는 등의 차이도 있다.

인자를 스택이 아닌 레지스터에 넘겨서 속도를 높이는 규약들도 있다.

64비트는 함수 호출 규약이 다르다.

profile
복습하기 위해 쓰는 글

0개의 댓글