Nested Procedures
- callee가 또 다른 function을 invoke 할 수 있다.
- $ra는 jal에 의해, $a0~3는 programmer에 의해 overwritten 될 것이다.
- SPILL 해야 한다!
- caller에서는 $a0~3(최대 16bytes), $t0~9(최대 40bytes)를 spill
- callee에서는 $ra와 $s0~7(최대 32bytes)를 spill
- preserved되거나 되지 않는 register들은 다음과 같다.
Allocating Space on the Stack
- callee는 $sp 기준 위쪽(주소가 더 작은쪽)을 사용한다. 그렇지 않으면 caller가 저장한 것들이 overlap될 것이기 때문이다.
- callee가 caller의 local variable에 마음대로 접근하는 것은 high level programming language에서도 허용되지 않는다. function이 memory의 어느 부분에 접근하는지를 기억하기 위해 OS, compiler 수준에서 activation record라는 개념을 도입한다.
- $fp (frame pointer) : memory address region을 제한하기 위해 사용된다.
- frame의 first word를 가리킨다. frame이란 현재 function에 할당된 stack space이다.
- local variable등에 접근하기 위한 base register 역할을 할 수 있다.
→ function은 $fp보다 작고 $sp보다 큰 address에만 접근가능하도록 제한된다.
Allocating Space on the Heap
- Stack
- function에 관한 전반에 관련되어 있다.
- base address를 감소시킴으로써 추가 공간을 할당할 수 있다.
- heap
- application의 어떤 instruction이든 접근할 수 있는 공간이다. 주로 전역변수들이 저장된다.
- base address를 증가시킴으로써 추가 공간을 할당할 수 있다.
MIPS Register Conventions