function 또는 Procedure Call에 들어가는 머신 인스터럭션에 어떤 절차가 들어갈까?
어떤 main이라는 function에서 A라는 function을 호출하면 main이 caller이 된다.
A는 callee가 된다.
caller는 callee에게 파라미터를 전달해야 한다.
caller가 callee가 접근할 수 있는 곳에 파라미터를 전달한다.
이때 레지스터를 이용하여 전달한다.
MIPS의 레지스터는 a1부터 시작해서 an구역에 파라미터를 저장한다.
caller는 callee에게 jump하면서 link한다.
여기서 jump는 해당 함수로 넘어가는 것이고 link하는 것은 caller와 callee를 연결하는 것이다.
이 link는 callee가 일을 마치고 caller에 돌아가는데 필요하다.
callee를 실행할 때는 callee를 실행하는데 필요한 로컬 변수들을 저장할 storage를 만들어야 한다.
이때 함수는 function scope를 가진다.
함수마다 scope가 정의되어 있다.
참고 글로벌 변수는 static data이기 때문에 계속 공간을 차지한다.
하지만 함수의 변수들은 dynamic data이기 때문에 함수 실행후 공간을 반납한다.
각 프로시져 혹은 함수마다 자신마의 로컬 스토리지가 있다.
activation record라고도 부른다.
어떤 값들이 이 안에 저장될까?
파라미터 및 로컬 변수들이 저장된다.
해당 함수에서만 접근하기 때문에 저장하는 것이다.
그리고 arguments와 return address가 저장된다.
arguments는 또 다른 함수를 호출할 때 자신의 arguments를 저장하기 위해 사용되는 것이다.
스택은 위에서 아래로 확장된다.
스택에서 스택 프레임의 시작 부분을 Frame Pointer(fp)가 가리킨다. 그리고 스택 최상단 Stack Pointer(sp)가 가리킨다.
프로그램 입장에서는 어디 메모리인지 신경쓰지 않기 때문에 모든 메모리를virtual memory처럼 생각한다.
TEXT부분이 Instruction이 저장된 부분이다.
나머지는 모두 데이터를 저장하는 것이다.
명령어를 저장하는 공간은 얼마 되지 않는다.
Reserved는 사용하지 않지만 나중을 위해 남겨둔 공간이다.
Static data는 글로벌 변수를 저장한 공간이다.
Static 선언한 변수를 생각하면 된다.