1. 먼저 StackFrame을 알아보기 전에 스택이란 무엇인지 알아보겠습니다.
쉽게 말해서 스택은 CPU가 연산을 할 때 사용하는 임시 저장 공간입니다.
여러 개의 데이터 항목들이 일정한 순서로 나열된 구조로서, 한쪽 끝에서만 새로운 항목을
삽입, 기존 항목을 삭제할 수 있는 자료구조입니다.
Stack 의 특징 때문에 흔히 "FILO (First-In-Last-Out)" 혹은 "LIFO (Last-In-First-Out)"
라고 한다. 선입후출, 후입선출 형 자료구조입니다.
FIFO 선입선출법(first in first out)
-먼저 들어간 것이 먼저 나옵니다.
LIFO 후입선출법(_last in first out)
-마지막으로 들어간 것이 먼저 나온다.
아래사진은 스택의 원리가 잘 설명되어 있는 이미지입니다.
표출처:네이버이미지
스택에서는 데이터의 한계(limit)가 있는데 이것을 초과하여 push할 경우 overflow,
자료가 없는 상황에서 pop할 경우 underflow라고 한다.
2. 그럼 이제 StackFrame에 대해 알아보도록 하겠습니다.
스택 프레임은 로컬 변수와 함수 호출에 사용됩니다.
스택 프레임 이란 EBP 레지스터를 사용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소에
접근하는 기법을 말한다. ESP 레지스터의 값은 프로그램 안에서 수시로 변경되기 때문에
스택에 저장된 변수, 파라미터에 접근하고자 할 때 함수 시작점 ESP를 EBP에 저장하고 이
를 함수 내에서 유지해주면, ESP 값이 아무리 변하더라도 EBP를 기준으로 안전하게 변수,
파라미터,복귀 주소에 접근 할 수 있습니다.
그럼 실제로 간단한 assembly 코드를 보면 이런 식입니다.
3: int main(int argc, char* argv[])
0040B500 push ebp <-- 함수 시작(기존의 EBP를 스택에 저장)
0040B501 mov ebp,esp <-- esp값을 ebp로 복사
0040B503 sub esp,48h <-- ebp~esp 함수사용공간 확보
5: int a = 1, b = 2;
7: return 0;
004010B0 mov esp,ebp <--ESP정리
004010B2 pop ebp <--EBP를 원래 기존값으로 복원
004010B3 ret <-- 함수 종료
위를 보면 함수 시작시 EBP값에 ESP를 넣고 ESP에서 필요한 함수 메모리 만큼 빼서 함수
사용 공간을 확보 하고 있음을 확인할 수 있습니다
EBP, ESP. EBP
스택 스택
ESP
참고한 사이트:http://www.reversecore.com ,
Copyright ⓒ 2011. 육승찬. All rights Reserved