함수 호출과 스택 구조 세번째 글입니다.
저번 게시물에서
7. A 함수 종료 2 에서 아래의 빨간 글씨로 중요 하다고 써놨습니다.
7. A 함수 종료 2 이제 main 함수 5라인으로 복귀합니다. 여기서 다시 R5 = 100으로 바꾸고 R7를 5로 바꿉니다. R5 = 100(?) R6 = 98 R7 = 5(?) ****** 중요 여기서 의문인점이 생깁니다. 도대체 main 함수의 스택 위치 인 100은 어디에서 왔으며(어디에 저장되어 있나?) 다음 실행라인(pc, R7)인 5라인은 어디에서 왔을까요?(어디에 저장되어 있나?) 이것은 다음 게시물에서 다루겠으며 어디에 저장할지 추측해 보세요. |
여기서 main 함수의 스택 위치 인 100 과
다음 실행라인(pc, R7)인 5라인 - 리턴 어드레스(return adress)은
예상 하셨을텐데 스택에 저장 됩니다.
그럼 어떻게 저장될까요?
다시 그림 A() 함수를 호출할때를 보시겠니다.
1. A 함수 호출 1
여기 4라인에서 A 함수를 호출합니다.
저번 게시물에서는 R5를 98로 로 바꾸었는데요.
R5 = R6(98) --> R5 = 98
R6 = 98
R7 = 4
원래는 최소 두가지 일을 더합니다.
저번 게시물때는 쉬운 설명을 위해 많은 것을 생략했었습니다.
1. 리턴 어드레스(return address)를 스택에 저장합니다. - 여기서는 메인함수 4라인이 아니라 다음에 실행할 메인함수 5라인 입니다.
2. R5(프레임포인터) 값을 스택에 저장합니다. - 여기서는 main 함수의 스택 시작값인 100
... (사실 이것 말고도 더 있습니다. 매개 변수라던가... 기타 레지스터라던가...)
그리고 다음에는 저번 게시물에 설명한 "4. A 함수 호출 9라인 - A함수 호출" 로 이동합니다.
그럼 다시 자세한 그림을 보겠습니다.
2. A 함수 호출 2 - 리턴 어드레스(return address) 값을 스택에 저장
스택에 다음 실행 위치(R7 + 1)인 5라인을 스택에 저장합니다. R7(프로그램 카운터 pc)
(R6) = R7(4) + 1 --> (98) = 5 line : 스택 주소 98에 코드 주소인 5라인을 저장
R6 = R6(98) - 1 --> R6 = 97
3. A 함수 호출 3 - R5(프레임포인터) 값을 스택에 저장
스택에 R5값(main 함수 스택 시작위치) 스택에 저장합니다.
(R6) = R5(100) --> (97) = 100 : 스택 주소 97에 R5((main 함수 스택 시작위치) 스택에 저장
R7 = 4
3. A 함수 호출 4 - 드디어 A함수로...
드디어 A 함수로 왔습니다.
R5 = R6(96) --> R5 = 96
R6 = 96
R7 = 9(A 함수 시작 라인)
오 드디어 이제 A 함수가 호출 되었습니다.
A 함수가 종료 될때는 위 역순으로 돌아 가게 되겠습니다.(노트에 추측해서 한번 그려보세요^^)
그럼 이제 종료하겠습니다..
..
..
..
..
다음 게시물에서 main 함수로 복귀를 보여 드리겠습니다.