1. 지난 시간 것 잠깐 복습!
    1. c 언어와 같은 HLL 에서와 달리 ML 레벨에서는 function call 을 지원하지 않음. 따라서 복잡한 과정을 거쳐 function call 을 처리하게 됨.
    2. Stack 에는 두 가지 종류의 저장 공간이 있음
      1. 하이에서 로우로 마이너스되며 정보가 쌓이는 지역 변수 저장 공간
      2. 로우에서 하이로 플러스되며 정보가 쌓이는 동적 데이터 공간.
      3. 만약 이 둘이 쌓이다 못해 만나서 공간을 넘쳐 버리면 stack overflow 가 발생함.
    3. Data 영역에 저장된 값들은 프로그램이 끝날 때까지 아무런 변화가 없음.
  2. Stack 에 대해 더 깊게 알아보자!

Untitled

  1. 스택에 저장되어야 하는 것들!
    1. 함수 호출 이후에도 값이 변하지 않고 저장되어 있어야 하는 register 의 값 ← 부모 함수에서부터 저장받은..?
    2. return address
    3. argument 들 ←? 5번째부터..??
    4. 지역변수
    5. 스택이란? first in last out!

Untitled

stack pointer가 stack 의 가장 최근 저장 위치를 가리킴.

정보를 저장한다면, 위에서 아래로 내려 오고, 정보를 인출할 때는 아래에서 위로 올라감. 즉 숫자가 커지니까 add 전자는 숫자가 작아지니까 sub

  1. Procedure call

Untitled

jal 은 함수 호출 시 사용되는 isa 로, 다음 주소를 레지스터 ra 에 저장한 뒤에 레이블로 점프함.

Untitled

jal loc 해서 b 의 loc 로 점프함. 그 다음에 sp 에 4를 더해서 그 다음 주소를 가리키게 해 준 다음에 ra 의 값을 sp 가 가리키는 주소에 저장함. 그 뒤 또 점프. 나중에 리턴하고 난 다음에는 sp 가 가리키는 주소 에 저장해 둔 ra 값을 다시 ra 에 저장해


아아.. 지난 시간 내용이 여기서부터가 아니었다 ㅠ

Untitled

  1. 레지스터는 메모리보다 훨씬 빠르다. 따라서 매핑을 통해 지역변수를 레지스터에 할당하면 훨씬 빠르게 동작하는 프로그램을 만들 수 있다.
  2. 만약 함수 호출 시, 변경되지 않았으면 하는 내용이 있다면 이를 Caller 에서 저장할 수도 Callee 에서 저장할 수도 있다. 이때 저장되는 값은 같으나 저장되는 위치가 다르다.

Untitled