스택 프레임(Stack Frame)이란?
함수 호출 시 생성되는 실행 컨텍스트 저장 영역
스택 프레임 구성 요소
- 지역 변수 (local variables)
- 매개변수 (parameters)
- 반환 주소 (return address)
- 이전 프레임 포인터 (saved FP)
2. SP (Stack Pointer)
정의
현재 스택의 top을 가리키는 레지스터
특징
- push/pop 시 계속 변한다 (동적)
- 스택의 유효 범위를 결정
- 스택 메모리는 "SP 위쪽"만 유효
핵심
SP는 "현재 스택 사용 범위"를 나타내는 동적 포인터
3. FP (Frame Pointer)
정의
현재 함수의 스택 프레임 기준점(base)을 가리키는 레지스터
특징
- 함수 실행 동안 고정 (정적)
- 변수 접근의 기준점 역할
- 이전 프레임과 체인을 형성
왜 필요한가?
SP는 함수 중간에 계속 움직인다:
push/pop
임시 값 저장
다른 함수 호출
이 때문에 SP 기준으로는 지역 변수 위치가 계속 바뀐다.
따라서:
이 함수의 고정 기준점이 필요 → FP
4. 함수 호출 시 내부 동작 (x86 기준)
스택은 낮은 주소 방향으로 성장한다고 가정
A가 B를 호출하는 상황
Step 1: CALL B
CPU 동작:
push return_address
jump to B
Step 2: B 함수 진입
push rbp ; 이전 FP 저장
mov rbp, rsp ; FP = SP
sub rsp, N ; 지역 변수 공간 확보
결과 스택 구조
높은 주소
─────────────────
│ A frame │
│ saved FP(A) │ ← FP (rbp)
│ return addr │
│ B local vars │ ← SP (rsp)
─────────────────
낮은 주소
5. 왜 FP를 saved FP 위치로 설정하는가?
이유 1 - 프레임 경계 표준화
FP 기준 오프셋 접근:
[FP + 0] → saved FP
[FP + 8] → return address
[FP - 8] → local variable
항상 동일한 규칙으로 접근 가능
이유 2 - 프레임 체인 형성
B FP → A FP → main FP → ...
이 체인을 따라가면:
- Stack trace 생성 가능
- 예외 처리 가능
- 디버깅 가능
이유 3 - 함수 종료 단순화
mov rsp, rbp ; SP = FP (local 제거)
pop rbp ; FP 복구
ret ; return address로 점프
지역 변수 개수와 상관없이 복귀가 O(1)
스택 프레임(Stack Frame)이란?
함수 호출 시 생성되는 실행 컨텍스트 저장 영역
스택 프레임 구성 요소
2. SP (Stack Pointer)
정의
현재 스택의 top을 가리키는 레지스터
특징
핵심
SP는 "현재 스택 사용 범위"를 나타내는 동적 포인터
3. FP (Frame Pointer)
정의
특징
왜 필요한가?
SP는 함수 중간에 계속 움직인다:
이 때문에 SP 기준으로는 지역 변수 위치가 계속 바뀐다.
따라서:
4. 함수 호출 시 내부 동작 (x86 기준)
스택은 낮은 주소 방향으로 성장한다고 가정
A가 B를 호출하는 상황
Step 1: CALL B
CPU 동작:
Step 2: B 함수 진입
결과 스택 구조
5. 왜 FP를 saved FP 위치로 설정하는가?
이유 1 - 프레임 경계 표준화
FP 기준 오프셋 접근:
항상 동일한 규칙으로 접근 가능
이유 2 - 프레임 체인 형성
이 체인을 따라가면:
이유 3 - 함수 종료 단순화
지역 변수 개수와 상관없이 복귀가 O(1)