Computer Science/컴파일러개론(Compiler)

[컴개/CI] IR Translation: Stack Management

gxxgsta 2023. 12. 14. 16:53
반응형
SMALL

Memory Organization (Stack)

 

Run-Time Stack

run-time stack이란 call stack이라고도 불리며, 한 함수를 call 할 때마다 생성되는 프레임이나 activation record이 구성하는 스택을 말한다.

 

Activation record

함수를 수행하기 위한 execution environment으로 스택의 한 칸을 의미한다.

Activation record에는 로컬 변수와 인자, 리턴값, 기타 임시 저장소(3-addr code에서 사용)를 의미하고, 재귀문일 때에도 각 call마다 하나씩 스택에 Activation record를 넣는다.

 

run-time stack의 연산은 아래와 같다.

- f 가 호출되면 f의 frame을 stack에 push (호출)
- f가 return되면 f에 대한 frame을 pop-up (리턴, 반환)

이때 스택의 Top frame은 현재 수행중인 함수의 frame이다.

 

Stack Pointers

 

스택이 아래로 자란다고 했을 때 stack에 push하는 경우 top 주소가 수행 중 증가한다.

이때, 프로그램 별로 크기가 다르기 때문에, 어디서부터 어디까지가 스택의 top인지를 표기하기 위해 시작과 끝지점을 타나내는 두 개의 포인터를 사용한다.

 

- Stack pointer (SP): frame top을 가리킨다.

- Frame pointer (FP): frame base를 가리킨다. base pointer라고도 불린다.

 

이때 두 개의 포인터를 사용하는 이유는, 보통 변수에 접근할 때 사용하는 주소가 절대 주소가 아닌 일정한 위치로부터 offset 만큼 떨어져 있는 주소, 즉 상대주소로 찾아간다. 따라서 두 개의 포인터를 사용하는 경우 둘 중 가까운 포인터를 기준으로 offset를 구할 수 있어 offset의 크기가 최대 절반까지로 줄어든다.

 

그러나 임시변수의 생성과 free가 많아 SP는 가변적이기 때문에 보통은 FP를 기준으로 접근한다.

 

 

위 사진에서 연두색으로 칠해진 부분이 디스크에서 존재하는 프로그램이다.

이때 데이터 부분에서 색칠되지 않은 글로벌 변수가 존재하는데, 이는 초기화 되지 않은 전역 변수이기 때문이다.

 

위의 스택의 회색 부분에서 enviroment를 미리 넣어주며, 이 부분에서 main() 함수를 호출할 수 있다.

 

 

반응형
LIST