함수 호출과 이로 인해 생기는 스택 구조에 대해 간략 적으로 설명해 보겠습니다.

정말 간략적이기 때문에 상당 부분을 생략했습니다.(리턴 주소, 함수 매개변수, 환경프레임 주소 저장 등등... 생락)

다음 게시글에서 좀더 자세한 설명을 추가 할테니 일단은 개념 정도만 설명하도록 하겠습니다.


일단 C언어스택 부터 보시겠습니다.






간단합니다. main 함수 A 함수 달랑 두개가 있습니다.

그 안에 지역변수각각 2개씩 들어 있습니다.

그럼 처음 스택 구조를 보겠습니다.



스택은 데이터가 추가 되면 위에서 아래로 추가 됩니다.

옆에 있는 주소는 그냥 임의로 추가 하였고

원래는 2(16비트), 4(32비트) 단위로 감소 해야 하지만 편의를 위하여 간략하게 만들었습니다.



그럼 여기서 C언어에서 12라인까지 실행되면 스택 구조가 어떻게 되는지 대략적으로 그려보겠습니다.







대략 위와 같은 그림이 됩니다.

12라인을 실행할때 main()의 지역 변수 2개와 A()의 지역 변수 두개가 스택에 각각 위치합니다.

프로그램 수업이나 책에 보면 지역 변수는 스택에 저장 된다고 배우시잖아요.

저 그림이 그것입니다.


옆에 보시면 main()함수 구역 스택과 A()함수 스택 구조가 나뉘어있습니다.(논리적으로)

이 나뉜 부분이 unix v6책 에서 r5레지스터 환경 프레임을 가르킨다고 했는데

저 함수 구역이 환경 프레임이라고 보시면 됩니다.


그리고 하늘색으로 표시된 화살표가 다음에 스택에 데이터를 집어 넣을 장소를 가르키며

unix v6책 에서는 r6레지스터(sp - 스택 포인터 레지스터)가

저곳을 가르키는 주소(위 그림에서 주소 96)를 가지고 있습니다.

만약 스택에 데이터가 추가 되면 r6 레지스터 값이 하나가 감소(r6 = r6 - 1) 하는것이죠


그리고 주황색 화살표를 보시면 현재 함수 시작위치를 가르키고 있는데

이것이 바로 r5레지스터(인텔계열은 ebp 레지스터)가 가지고 있는 주소 값(위 그림에서 주소98)입니다.


main함수가 실행 중이면 r5 레지스터는 주소 100을 가지고 있고

A함수가 실행중이면 r5레지스터는 98를 가지고 있습니다.


다음 게시물에서는 main 함수 라인별로 따라가며 해보도록하겠습니다.


함수 호출과 스택 구조 2

http://fehead.tistory.com/200


+ Recent posts