함수 호출과 스택 구조 세번째 글입니다.


저번 게시물에서


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

R7 = 4




3. A 함수 호출 3 -  R5(프레임포인터) 값을 스택에 저장



스택에 R5값(main 함수 스택 시작위치) 스택에 저장합니다.


(R6) = R5(100) --> (97) = 100 : 스택 주소 97에 R5((main 함수 스택 시작위치) 스택에 저장

R6 = R6(97) - 1  --> R6 = 96

R7 = 4





3. A 함수 호출 4 -  드디어 A함수로...




드디어 A 함수로 왔습니다.


R5 = R6(96) --> R5 = 96

R6 = 96

R7 = 9(A 함수 시작 라인)



오 드디어 이제 A 함수가 호출 되었습니다.


A 함수가 종료 될때는 위 역순으로 돌아 가게 되겠습니다.(노트에 추측해서 한번 그려보세요^^)

그럼 이제 종료하겠습니다..

..

..

..


..


다음 게시물에서 main 함수로 복귀를 보여 드리겠습니다.

+ Recent posts