Skip to content

스택 포인터와 프레임 포인터 #29

Description

@kmw10693

스택 프레임(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)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions