기본적으로 프로그램이 실행될 때 수많은 함수들이 호출이 되고 다시 리턴된다. 보통 함수 호출은 스택을 통해 이루어지는데, 과정을 대략적으로 설명하면 다음과 같다.
1. 함수가 사용할 파라미터를 스택에 넣고, 함수 시작 주소로 점프한다.
2. 함수 내에서 사용할 스택 프레임을 구성한다.
3. 함수 내부 내용 수행
4. 함수를 호출한 주소로 돌아가기 위해 스택을 복원시킨다.
이때 2번 내용을 프롤로그, 4번 내용을 에필로그라고 한다.
먼저 프롤로그를 살펴보자.
① RET |
② SFP |
위 그림에서, 메모리의 제일 아래를 나타내는 주소가 EBP이면서 ESP인데, 복귀 주소(RET)를 스택 맨 아래에 넣어두고, SFP는 RET 위에, 이 바로 아래에 EBP로 설정해두고, ESP값에 EBP 값을 넣는 과정이 프롤로그이다.
이 이후 함수의 주소로 점프되면서 함수의 내용을 실행하다 보면, 함수 마지막 부분에 에필로그 작업이 시작된다.
에필로그는 어셈블리로 leave, ret 두가지로 구성되어 있다.
leave | ret |
mov %ebp %esp pop %ebp |
pop %eip jmp %eip |
leave 명령어는 esp레지스터에 ebp의 주소를 넣어, ebp와 esp를 동일하게 만드는 것이다. 그 후, ebp를 스택 프레임에서 꺼내므로서 함수를 호출하기 전의 모습으로 스택을 만들어 둔다.
ret 명령어에서 pop %eip를 통해 다음 주소를 찾아 스택에서 꺼내고, jmp를 통해 해당 주소로 이동하며 함수의 에필로그가 끝나게 된다.
'Computer' 카테고리의 다른 글
운영체제 12주차 (0) | 2019.11.22 |
---|---|
[asm] INT 21H (0) | 2019.10.01 |
GDB 실습하면서 정리하는 명령어 (0) | 2019.09.25 |
메모리 구조 (0) | 2019.09.24 |
Register - 간단 개념 정리 (0) | 2019.09.23 |