ncloader  0.1
 모두 데이타 구조 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 매크로 그룹들 페이지들
Define of Activation Record
+ Define of Activation Record에 대한 협력 다이어그램:

진도를 더 나가기 전에 부트로더에서 필요한 몇 가지 추가적인 함수들을 구현하기로 한다. 이 함수들은 시스템이 제공해주는 (BIOS interrupt) 를 사용하는 것이 대부분이다. 주의할 점은 부트로더 크기(512 Bytes) 안에서 모두 구현될 수 있어야 한다는 것이다.

이 장에서는 Activation Record 에 대해 이해를 하고, Activation Record 를 정의한다.

2.3.1 함수 호출을 위한 스택 구조 설계

함수를 호출하기 위해 “call” 명령을 사용한다. “call” 명령은 그 다음 명령이 있는 메모리 번지를 stack 에 push 하고 명령 다음에 따라오는 주소로 Instruction Pointer (IP) 를 이동시킨다. 이 때, SP 값은 2가 줄어든다. (RealMode 인 경우) Stack 은 거꾸로 자라는 것이기 때문에 초기에 SP 를 설정할 때, SP 값은 스택에서 가장 큰 주소 값을 가지도록 해야 한다. 함수 호출에 있어서의 관건은 인자와 반환 값이다. 인자를 어떻게 주고 받을 것이며, 반환 값은 어떻게 받을 것인가를 고민해야 하는데, 필자는 스택을 사용하기로 했고, Local Variables 에 접근 하기 위해 Base Pointer(BP) 를 사용하기로 했다. 말로 계속 설명하는 것보다 간단한 스택 구조를 코드를 통해 보는 것이 낫을 것이다.

push bp
mov bp, sp
pusha
… [함수의 실제 코드]
popa
pop bp
ret

위와 같은 뼈대를 갖는다. BP 는 초기 설정 값이 SP 와 같다. 즉 스택의 시작 주소(실제로는 가장 큰 주소 값)를 갖고 있는 것이다. BP 를 Stack 에 push 하고 SP 의 값으로 BP 를 대체한다. 이렇게 하면 BP 값과 인자가 저장된 Stack 의 Offset 값으로 접근할 수 있는 것이다. 아래 그림을 보자

Lower address
함수 내부 스택 사용 값들
BP
RET
Argument 3
Argument 2
Argument 1Higher address

인자 1 은 가장 먼저 Push 된 인자이다.

결과적으로 위와 같은 구조로 스택이 구성된다. 위에 저장된 BP 값은 상위 함수의 인자를 접근하기 위해 사용되는 것이므로 스택에 보관하는 것이다.