CS지식/자료구조 (Data Structure)
메모리 구조 정리 (스택(Stack) 집중)
불광동 물주먹
2025. 4. 3. 16:12
2024년 4월 3일
메모리 공부 (스택 집중)
전체 메모리 구조 개요 (낮은 주소 → 높은 주소)

📘 스택(Stack) 구조 정리 - 시스템 관점 요약
1️⃣ 스택의 기본 개념
항목내용
구조 | LIFO (Last In, First Out) |
위치 | 프로세스 메모리의 Stack 영역 |
방향 | 높은 주소 → 낮은 주소 방향으로 성장 |
사용 목적 | 함수 호출 시 지역 변수, 매개변수, 반환 주소, 이전 상태 저장 등 |
2️⃣ 주요 레지스터: ESP vs EBP
레지스터역할설명
ESP (Stack Pointer) | 스택의 현재 꼭대기 위치 | 지역 변수 할당, push/pop 시 변동 |
EBP (Base Pointer) | 함수의 스택 프레임 기준점 | 지역 변수/매개변수 접근 시 기준점, 함수 내 고정 |
✅ ESP는 변동, EBP는 고정된 기준
3️⃣ 함수 호출 시 스택 프레임 생성 흐름
예: a() → b() → c() 호출
🔄 함수 진입 시
push ebp ; 이전 함수의 EBP 저장
mov ebp, esp ; 현재 프레임 기준점 설정
sub esp, N ; 지역 변수 공간 확보
🧷 메모리 스택 상태 (위가 높은 주소)
EX)
| arg1, arg2... |
| return address to caller | ← call 시 자동 저장됨
| previous EBP | ← push ebp
| local variable n |
| ... |
↑ ESP: 변동함
EBP: 고정 기준
4️⃣ 함수 리턴 시 스택 복구 흐름
mov esp, ebp ; 스택 포인터를 프레임 기준으로 복구
pop ebp ; 이전 프레임의 기준점 복원
ret ; return address pop 후 점프
❗ ESP는 따로 저장하지 않아도, EBP와 return address만으로 복구됨
5️⃣ 콜 스택(Call Stack)이란?
- 현재까지 호출된 함수들의 스택 프레임이 쌓인 구조
- 리턴되면 하나씩 pop되어 이전 상태로 복귀
- 디버깅 시 backtrace 추적이 가능한 이유

6️⃣ ESP는 왜 따로 저장하지 않나?
- call 명령어가 return address를 스택에 자동 저장
- mov esp, ebp + ret 만으로 자연스럽게 복귀 가능
- ESP는 현재 상태를 가리키는 임시 포인터일 뿐, 복귀 흐름에 직접 쓰이지 않음
7️⃣ 요약 흐름도
함수 호출: call → return addr 저장 → 새 프레임 생성 (push ebp → mov ebp, esp)
실행 중: ESP는 계속 변동 (지역 변수, push 등)
함수 종료: mov esp, ebp → pop ebp → ret → return address jump
4️⃣ 힙 vs 스택 요약 비교
힙 | 스택 | |
생성 방법 | new로 생성 | 메서드 호출 시 자동 생성 |
할당 위치 | 런타임 중 동적으로 | 컴파일 시 위치 고정 |
메모리 크기 | 비교적 큼 | 작음 (제한 있음) |
수명 | GC가 제거 | 메서드 종료 시 자동 pop |
예시 | new Dog() | int a = 10; (지역 변수) |
📌 최종 요약
포인트설명
스택은 함수 호출/복귀의 핵심 구조 | |
EBP는 고정 기준점, ESP는 현재 위치 포인터 | |
각 함수는 스택 프레임 하나를 구성 | |
콜 스택은 스택 영역에서 자연스럽게 구성됨 | |
ESP는 복구 대상이 아님 (EBP와 ret로 충분) |