봉황대 in CS

[운영체제] Call Stack Frame & ESP, EBP 레지스터 본문

Computer Science/Operating System

[운영체제] Call Stack Frame & ESP, EBP 레지스터

등 긁는 봉황대 2022. 7. 8. 16:43

콜 스택 (Call Stack)

함수의 호출을 기록하는 자료구조

메모리의 스택(stack) 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.

 

메모리 상의 프로세스


함수 호출 시 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소 값, 함수에서 선언된 지역 변수 등이 저장되는데
이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보스택 프레임(Stack Frame)이라고 한다.

* 프레임 (Frame) : 함수 호출 시 스택 상에서 운용되는 데이터

* 프레임 포인터 (Frame Point / Stack Frame Pointer)
스택 상의 프레임 시작 주소 (스택에 push 되기 전 top에 있던 프레임의 시작 주소)

함수마다 프레임의 크기가 다르기 때문에
함수 호출이 끝난 뒤, 해당 함수가 호출되기 이전 상태로 되돌아가기 위해서는
바로 이전 프레임의 프레임 포인터 값을 프레임 내에 간직하고 있어야 한다.

* 스택 포인터 (Stack Pointer) : 콜 스택의 최상위 메모리 주소

EBP 레지스터

Extended Base Pointer Register
현재 스택 프레임의 베이스 주소(최하단 주소)를 저장하고 있는 레지스터

ESP 레지스터

Extended Stack Pointer Register
현재 스택의 최상단 주소를 저장하고 있는 레지스터


메모리 상에서의 스택은 높은 주소에서 낮은 주소로 자라기 때문에, 낮은 주소일수록 최상단의 주소이다.
따라서 EBP 레지스터는 항상 현재 스택에서의 가장 높은 주소 값을 가지고 있으며,
ESP 레지스터는 가장 낮은 주소값을 가지고 있다.

 


[ main 함수에서 func(x, y) 함수를 호출했을 경우 EBP, ESP 레지스터 값의 변화 과정 ]


1. main 함수 실행
EBP 레지스터는 main 함수의 최하단 주소 값,
ESP 레지스터는 main 함수의 최상단 주소 값을 저장한다.


2. func(x, y) 함수 실행
먼저 func 함수의 프레임에 바로 이전 프레임의 프레임 포인터 값(main 함수의 프레임 포인터 값) 즉, EBP 레지스터의 값을 저장한다.


그 후 EBP 레지스터를 ESP 레지스터의 값으로 변경하고,
ESP 레지스터를 func 함수의 최상단 주소 값으로 변경한다.

 


함수 호출 시 아래의 작업이 순서대로 진행된다.

PUSH EBP 		; 함수 시작 (EBP를 사용하기 전에 기존의 값을 스택에 저장) 
MOV EBP, ESP		; 현재의 ESP를 EBP에 저장

. . .			; 함수 본체
                
MOV ESP, EBP		; ESP를 함수 시작했을 때의 값으로 복원
POP EBP			; 리턴되기 전에 저장해 놓았던 원래 EBP의 값으로 복원 
RETN			; 함수 종료


따라서 ESP가 변경되더라도 EBP가 변경되지 않기 때문에 안전하게 지역 변수와 매개 변수를 액세스 할 수 있으며,
함수의 호출이 모두 끝난 뒤에 해당 함수가 호출되기 이전 상태로 되돌아갈 수 있다.

 

반응형
Comments