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


이 게시글에서는 함수 리턴에 대해 설명하겠습니다.
이 글 끝에 보면 Unix V6에서 커널 switch 를 이해 할수 있는 힌트가 있습니다.



1. A 함수 리턴 1 - return 명령 실행





자 그럼 이어서 하겠습니다.

A 함수 13번째 라인를 실행한다고 하겠습니다.( 알아보기 쉽게 return 를 넣었습니다.)

이때 레지스터 값들은


R5 = 96 (A 함수 프레임)

R6 = 94 (스택 포인터)

R7 = 13 (code 13라인)





2. A 함수 리턴 2 - 스택 포인터 복구(R6)


A 함수가 리턴을 만났습니다.


먼저 R6 스택포인터(sp)를 R5로 바꿉니다

R5 = 96

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

R7 = 13






3. A 함수 리턴 3 - main() 프레임 포인터 복구(R5)

이제 R6 가 가르키는 스택에서 main 함수 프레임 값을 가져와 R5에 복구 합니다.

R6 = R6(96) + 1 ; ( 으.. 그림를 살짝 잘못 캡쳐 했네요 ㅡ.ㅜ R6가 97이어야 하는데 이해좀 ㅡ.ㅜ)

R6 = 97;

R5 = 100;   -->  R5 = (R6)  R5 = (스택 97 번지의 값) (**그림 참고)








4. A 함수 리턴 4 - return address 복구(R7)


R5 = 100;

R6 = 97 + 1;

R7 = 5 라인;  --> 스택(99 주소)에서 리턴 어드레스 복구





이로서 A 함수에서 main함수로 리턴 되었습니다.


이것이 함수의 호출과 스택 구조가 되겠습니다.


설명이 좀 부실하네요 ^^




4. 이상한 함수 리턴과 커널 스위칭 힌트


자 그럼 게시글의 마지막으로 커널 스위칭에 대해 살짝 힌트를 드리겠습니다.




자 여기서 18라인을 실행하면 코드는 몇라인으로 갈까요?^^

위 코드에서 r5은 R5레지스터라 가정하겠습니다.^^


반드시 노트에 스택과 레지스터를 그려보시고

생각해 보십시요.

...

...



아 return 1; return 0; 에 대한것을 빼먹었군요.


마지막에 return 1; 를 하면

1이라는 값은 R0 에 저장됩니다.

호출한 함수에서는 호출이 끝나고 R0 레지스터 값을 반환값으로 처리합니다.




+ Recent posts