*c언어에서 정적변수란, 프로그램이 시작할 때 생성되어 끝날 때 소멸하는 변수.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dd1587&logNo=221106199316
OS 에서는 프로그램 하나당 이 막대의 메모리를 할당한다. 즉 하나의 프로그램에는 stack, data, code 에 해당하는 메모리가 각각 존재한다.
stack pointer 레지스터는 스택의 가장 최근의 저장 위치를 가리킴. 그래서 예를 들어서 main 함수가 스택에 들어갈 경우, 제일 밑 부분을 가리키고 있음. 그리고 만약에 stack 에 정보를 저장하고 싶다? 그러면 레지스터가 4바이트니까, 4바이트만큼을 빼주면 한 칸의 메모리 공간을 확보할 수 있음. 그리고 인출을 할 때는 4만큼 더해주면 올라오면서 정보를 꺼내 옴.
jal 은 뒤에 레이블이 오고, 그 레이블로 점프를 하되, ra 라는 레지스터에 그 다음에 실행하기로 예정된 메모리의 주소를 저장시킨 뒤 jump 함.
이 경우 조금 더 복잡한데, 1) 우선 A 에서 jal loc 해서 그 다음 실행할 주소를 ra 레지스터에 저장하고 B 의 loc 로 점프를 함. 2) 그럼 B 의 loc 에서 명령어를 실행. sub 라고 했으니까, 메모리 공간을 하나 더 차지. 3) 그리고 나서 sp 레지스터에다가 ra의 주소(A 로 돌아가기 위한)를 저장함. 4) 그 다음에 jal loc2 를 통해 또 이동함.(이때 ra 에는 B 로 돌아오기 위한 새로운 값이 할당됨.) 5) 그럼 그리고 나서 C 에서 B 로 돌아오기 위해 ra 를 사용함. 6) 그럼 이때의 ra 에 다시 a 로 돌아가기 위한 그 값 즉 sp 에 복사해 두었던 값을 다시 가져와서 ra 에 둠. (괜히 sp 를 사용한 게 아님. 0(sp) 는 우리가 아까 만들었던 그 추가적인 공간을 가리키게 됨. sp 가 다시 b 로 돌아왔을 테니까.) 7) 그리고 나서 이유를 정확히는 모르지만, sp 에 할당된 추가 4바이트 공간을 다시 지워줌. 8) a로 돌아가도록 수정된 ra 를 이용해 점프함.