ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1074) N
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (183)
      • Unreal (69)
      • Unity (103)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (349) N
      • C++ (168) N
      • C# (90)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (10)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 그래픽스
  • 프로그래머스
  • 알고리즘
  • 오블완
  • 클래스
  • SQL
  • C
  • 문자열
  • 함수
  • 포인터
  • 배열
  • 언리얼
  • 파이썬
  • string
  • 티스토리챌린지
  • C++
  • Unity
  • 백준
  • c#
  • 유니티

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

스택 포인터와 프레임 포인터
CS/자료구조 & 알고리즘

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

2024. 4. 16. 22:10

스택 프레임 (Stack Frame)

기본적으로 함수가 호출될 때마다 전달한 인자와 정의한 지역(자동) 변수가 높은 주소부터 낮은 주소의 방향으로 차례대로 저장되는 구조이다. 이외에도 다른 함수를 호출할 때 복귀할 주소(다음 실행할 명령어의 주소), 프레임 포인터 및 보존되는 레지스터들이 스택에 저장된다. 스택 포인터는 함수 호출 시작부터 피호출 프로그램이 실행되는 단계 차례대로 저장되는 값들을 저장하기 위해 현 시점에서 저장할 메모리의 위치를 가리킨다.  

 

스택 프레임에 저장되는 값

- 복귀 주소

- 호출자 루틴의 프레임 포인터

- 사용하던 보존 레지스터

- 피호출자에 전달하는 인자

- 피호출자에서 사용되는 지역 변수들

프레임 포인터 (Frame Pointer)

함수 호출이 끝난다면 상위 호출로 돌아기전에 지역 변수에 할당한 자원을 파괴한 후 스택 포인터를 옮겨서 호출자가 함수를 호출하던 상황을 만들어야한다. 이 때, 프레임 포인터가 사용되는데 프레임 포인터는 호출자가 호출하던 시점의 스택 포인터를 저장하고 피호출 프로그램이 종료할 때 이 값을 이용하여 스택 포인터를 재조정하는데 사용한다.  

스택 포인터는 특수 레지스터, sp 레지스터에 저장되고 프레임 포인터는 fp 레지스터에 저장된다.

 

현 상황에서 func2()가 종료되면 스택 포인터는 fp 레지스터에 저장된 프레임 포인터를 보고 되돌아가야 한다. 하지만 fp 레지스터에는 func3()의 프레임 포인터 fp가 저장되어 있었고 func2()의 fp는 어디있는 지 모른다.

 

사실 func3()를 호출할 당시 fp 레지스터에 저장된 func2() 프레임 포인터가 스택에 저장된다.

 

추후 func3() 함수를 정상적으로 실행하고

func3()를 호출이 끝나고 func2()로 돌아오는 과정에서 스택 포인터를 fp 레지스터 값으로 바꾼다. 현재 스택 포인터 주소에는 func2()의 프레임 포인터가 저장되어 있고 이 값를 fp 레지스터에 초기화한다.

 

프레임 포인터는 현 프로시저가 사용하는 스택 프레임의 경계값이라고 할 수 있다.

 

복귀 단계에서는 다음 실행할 명령어 위치를 프로그램 카운터에 저장해야한다. 보통 다음 실행할 명령어 위치는 순차적 실행이 진행된다면 1워드 씩 증가하는 프로그램 카운터를 참조하면된다. 복귀할 때 실행할 명령어의 주소를 가져와야하기 때문에 함수 호출 시점에서 현재 프로그램 카운터를 스택에 저장하게된다.

따라서 현재 스택 프레임에는 프레임 포인터 뿐만 아니라 복귀 주소 또한 스택에 저장되어 있다.

https://narakit.tistory.com/144

저작자표시 (새창열림)

'CS > 자료구조 & 알고리즘' 카테고리의 다른 글

힙 (Heap) / 이진 힙 (Binary Heap)  (0) 2024.06.13
우선 순위 큐 - Priority Queue  (1) 2024.06.13
에이전트의 정의  (0) 2024.04.08
[C++] 라운드 로빈 스케줄링 구현 (우선순위 큐 이용)  (0) 2024.03.06
[C++] lower bound, upper bound  (0) 2023.12.19
    'CS/자료구조 & 알고리즘' 카테고리의 다른 글
    • 힙 (Heap) / 이진 힙 (Binary Heap)
    • 우선 순위 큐 - Priority Queue
    • 에이전트의 정의
    • [C++] 라운드 로빈 스케줄링 구현 (우선순위 큐 이용)
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바