함수 호출과 스택 구조 네번째 글입니다.
이 게시글에서는 함수 리턴에 대해 설명하겠습니다.
이 글 끝에 보면 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 레지스터 값을 반환값으로 처리합니다.