|
ncloader
0.1
|
Define of Activation Record에 대한 협력 다이어그램:진도를 더 나가기 전에 부트로더에서 필요한 몇 가지 추가적인 함수들을 구현하기로 한다. 이 함수들은 시스템이 제공해주는 (BIOS interrupt) 를 사용하는 것이 대부분이다. 주의할 점은 부트로더 크기(512 Bytes) 안에서 모두 구현될 수 있어야 한다는 것이다.
이 장에서는 Activation Record 에 대해 이해를 하고, Activation Record 를 정의한다.
함수를 호출하기 위해 “call” 명령을 사용한다. “call” 명령은 그 다음 명령이 있는 메모리 번지를 stack 에 push 하고 명령 다음에 따라오는 주소로 Instruction Pointer (IP) 를 이동시킨다. 이 때, SP 값은 2가 줄어든다. (RealMode 인 경우) Stack 은 거꾸로 자라는 것이기 때문에 초기에 SP 를 설정할 때, SP 값은 스택에서 가장 큰 주소 값을 가지도록 해야 한다. 함수 호출에 있어서의 관건은 인자와 반환 값이다. 인자를 어떻게 주고 받을 것이며, 반환 값은 어떻게 받을 것인가를 고민해야 하는데, 필자는 스택을 사용하기로 했고, Local Variables 에 접근 하기 위해 Base Pointer(BP) 를 사용하기로 했다. 말로 계속 설명하는 것보다 간단한 스택 구조를 코드를 통해 보는 것이 낫을 것이다.
위와 같은 뼈대를 갖는다. BP 는 초기 설정 값이 SP 와 같다. 즉 스택의 시작 주소(실제로는 가장 큰 주소 값)를 갖고 있는 것이다. BP 를 Stack 에 push 하고 SP 의 값으로 BP 를 대체한다. 이렇게 하면 BP 값과 인자가 저장된 Stack 의 Offset 값으로 접근할 수 있는 것이다. 아래 그림을 보자
| Lower address | |
| 함수 내부 스택 사용 값들 | |
| BP | |
| RET | |
| Argument 3 | |
| Argument 2 | |
| Argument 1 | Higher address |
인자 1 은 가장 먼저 Push 된 인자이다.
결과적으로 위와 같은 구조로 스택이 구성된다. 위에 저장된 BP 값은 상위 함수의 인자를 접근하기 위해 사용되는 것이므로 스택에 보관하는 것이다.