개념 정리

함수의 프롤로그, 에필로그

hyoooon 2021. 3. 11. 15:50

 

1. 스택프레임

 

스택프레임 개념을 정리해보자.

스택 프레임

스택 프레임이란 함수가 호출되면 스택에 쌓이는 정보들로, 함수 인자, return addr, sfp, 지역함수가 있다. 이를 스택 프레임이라 한다.

 

그렇다면 함수가 호출되는 과정에 대해 알아보자.

 

 

 

2. 함수의 호출과정

 

(1) 사용할 인자 값을 스택에 넣고 함수 시작 주소로 jump

(2) 스택 프레임 생성 = 함수 실행 준비 과정 = 프롤로그

(3) 함수 기능 수행

(4) 사용한 스택 복원 = 자신을 호출한 곳으로 돌아가기 = 에필로그

 

그렇다면 프롤로그와 에필로그란 무엇인가? 자세히 알아보도록 하자.

 

 

# 함수의 프롤로그

프롤로그란 호출된 함수가 실행할 준비를 하는 과정으로, 다음 명령어를 실행한다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡ

|    push ebp         |

|   mov ebp, esp   |

ㅡㅡㅡㅡㅡㅡㅡㅡㅡ

push ebp : 함수호출이 끝나면 호출한 곳으로 되돌아가기 위해 이전 함수의 ebp를 넣는다.

--> main 함수의 ebp값을 push 함으로써 esp값은 4만큼 줄어든다.

mov ebp, esp : 호출된 함수의 시작을 알리기 위하여 현재 esp 값을 ebp에 넣는다.

--> esp가 가리키는 곳을 ebp도 가리키게 된다.

 

프롤로그 전                                                                                  프롤로그 후

 

이 후 함수의 코드들이 실행되고 지역변수도 쌓이게 된다.

 

 

# 함수의 에필로그

함수의 에필로그는 함수의 기능을 수행하고 난 후, 호출한 곳으로 돌아오기 위해 스택을 복원하는 과정이다. leave와 ret를 실행한다.

 

① leave

ㅡㅡㅡㅡㅡㅡㅡㅡㅡ

|   mov esp, ebp   |

|   pop ebp           |

ㅡㅡㅡㅡㅡㅡㅡㅡㅡ

mov esp, ebp : 함수를 종료하기 위해 ebp값을 esp에 복사한다. ebp가 가리키는 곳을 esp도 가리키게 된다.

pop ebp : 현재 esp가 가리키고 있는 sfp를 pop하면 이전 함수(현재 함수를 호출했던 함수)로 돌아갈 수 있게 된다.

 

 

에필로그 전                                                                                   leave 실행 후

 

② ret

ㅡㅡㅡㅡㅡㅡ

|   pop eip   |

|   jmp eip   |

ㅡㅡㅡㅡㅡㅡ

pop eip : esp가 가리키는 return 주소를 eip에 넣어 다음에 실행할 명령어를 지정해준다.

jmp eip : 다음에 실행할 명령어로 이동. 함수를 호출했던 곳으로 돌아가게 된다. 고로 함수를 호출한 후 뒤의 명령을 계속해서 실행할 수 있게 됨.