시스템 프로그래밍

10-1. 절차적 함수 호출(Procedure Call) 지원 CPU 모델

CalebHong 2022. 5. 25. 11:13

스택 프레임(Stack Frame)

 - 함수 별로 선언된 변수들의 메모리 공간의 구분

 - 다음에 저장할 메모리 주소를 레지스터의 SP(Stack Pointer)에 저장

 

FP Register

 - 레지스터에는 반환 후 SP 위치를 알지 못함

 - 반환 후 되돌아갈 주소를 저장하는 레지스터 공간은 FP(Frame Pointer) Register

 - 다시 말하면 FP는 SP의 백업

 

FP Register 문제점

 - 함수 내 함수 호출이 반복적으로 실행되면 FP가 덮어쓰게 됨

 - 이를 해결하기 위해 FP의 백업이 필요

 

FP Register 해결책

 - 스택 메모리를 FP의 백업으로 사용

 - FP가 덮어쓰기가 되기 전 SP가 가리키는 메모리 주소에 현재 FP의 주소 값을 저장

 - 반환은 이를 역순으로 사용

 

정리

1. 메인 함수의 지역변수들을 스택에 저장하고 sp레지스터가 처음으로 fp레지스터에게 백업을 요청
2. 요청한 메모리에는 그냥 스택의 맨 처음 주소를 담아두고, 요청한 메모리의 주소를 fp레지스터에 저장
3. 메인안의 첫번째 함수 지역변수들을 스택에 담고 두번째로 fp레지스터에게 백업을 요청
4. fp레지스터는 아까 저장된 메모리주소를 덮어씌울순 없으니 현재 요청된 메모리에 아까 저장된 메모리주소를 적고 현재 요청된 메모리의 주소를 새롭게 fp레지스터에 저장
5. 메인안의 함수안의 함수 지역변수가 스택에 저장되고 sp레지스터가 세번째로 fp레지스터에게 백업을 요청
6. fp레지스터는 두번째와 마찬가지로 자신이 현재가지고있는 메모리주소를 덮어씌울 수 없으니 지금 저장된 메모리주소를 현재 요청된 메모리에 담고 현재 요청된 메모리의 주소를 새롭게 fp레지스터에 저장
7. 이 과정을 함수체인이 끝날때까지 게속 반복하다 마지막 함수의 선언이 끝나고 각 함수 실행 후, 지역변수가 리턴될 때 sp레지스터가 fp레지스터에게 (돌아가는) 백업을 요청함
8. fp레지스터는 지금 현재 담고있는 메모리주소로 sp레지스터를 백업시킴
9. sp레지스터는 백업된 위치에서 그 함수의 지역변수를 리턴하고 다시 fp레지스터에게 백업요청
10. fp레지스터는 아까 sp레지스터를 백업시켜서 온 현재 메모리의 값을 참고하여 그 값의 주소로 sp레지스터를 백업시킴
11. 이 과정을 반복하여 스택 초기화