변수의 기록

메모리 구조 정리 (스택(Stack) 집중) 본문

CS지식/자료구조 (Data Structure)

메모리 구조 정리 (스택(Stack) 집중)

불광동 물주먹 2025. 4. 3. 16:12

2024년 4월 3일

메모리 공부 (스택 집중)

 

 

 전체 메모리 구조 개요 (낮은 주소 → 높은 주소)

 

사진 출처 - https://www.tcpschool.com/c/c_memory_structure

 

 

📘 스택(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 추적이 가능한 이유

사진 출처 - https://developbear.tistory.com/99


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로 충분)