호출과 반환의 세부 단계

호출 한 번에, 부른 쪽과 불린 쪽은 일을 어떻게 나눠 맡을까?

세 묶음

일은 세 묶음으로 나뉩니다

스택 동적 지역 변수가 있으면 단계가 늘어납니다. 호출자가 다섯 가지를 하고, 피호출자가 시작하며 두 가지(프롤로그), 끝내며 다섯 가지(에필로그)를 합니다.

호출자는 부른 쪽, 피호출자는 불린 쪽입니다. 스택 동적 지역 변수는 호출 때 스택에 칸이 생기고 끝나면 사라지는 지역 변수입니다.

호출자 동작

부른 쪽이 하는 다섯 가지

호출자는 새 인스턴스를 만들고, 자기 실행 상태를 저장하고, 매개변수를 계산해 넘기고, 반환 주소를 넘긴 뒤, 제어를 넘깁니다.

4편의 예제입니다. 인스턴스는 호출 한 번의 칸 묶음, EP(환경 포인터)는 실행 중인 인스턴스의 바닥을 짚는 값입니다. 반환 주소 칸의 main은 돌아갈 함수입니다.

프롤로그

불린 쪽이 시작하며 하는 두 가지

피호출자는 시작하면서 지금까지의 EP를 동적 링크 칸에 저장하고 EP를 새 값으로 바꿉니다. 그리고 지역 변수의 칸을 할당합니다.

동적 링크는 4편에서 본, 부른 쪽 인스턴스를 가리키는 칸입니다. 할당은 쓸 칸을 받는 것입니다.

에필로그 ① ②

끝낼 때는 먼저 값을 돌려줍니다

에필로그의 처음 둘은 값을 돌려주는 일입니다. 돌려줄 매개변수의 값을 실 매개변수(호출할 때 넣은 변수)로 복사하고, 함수라면 반환값을 호출자가 가져갈 곳으로 옮깁니다.

①은 값을 돌려주는 매개변수(8강)가 있을 때만 합니다. 변수 이름 a와 x는 예시입니다.

에필로그 ③

스택과 EP를 호출 전으로

셋째는 스택을 되돌리는 일입니다. 스택의 맨 위를 가리키는 스택 포인터를 EP 바로 아래 칸으로 내리고, EP에 동적 링크의 값을 넣습니다. 이것으로 불린 쪽의 인스턴스가 걷힙니다.

EP 바로 아래 칸은 부른 쪽 인스턴스의 맨 위 칸입니다. 흐려진 fun2의 칸은 이제 스택이 아닙니다.

에필로그 ④ ⑤

상태를 되돌리고 돌아갑니다

마지막으로 호출자의 실행 상태를 되돌리고 제어를 돌려줍니다. 호출자 다섯, 프롤로그 둘, 에필로그 다섯으로 호출 한 번이 끝납니다.

다음 편

이제 여러 겹 쌓인 스택을 읽어 봅니다

6편쌓인 스택에서 내 변수는 어디 있을까? 9강 목록