<aside> 💡 목차
</aside>
<aside> 💡 Caller-saved 레지스터와 Callee-saved 레지스터의 구분은 MIPS의 레지스터의 개수가 유한하다는 점에서 오는 한계점을 해결하기 위한 솔루션입니다.
MIPS는 총 32개의 레지스터를 가지고 있는데, 이 중 16개는 Caller-saved 레지스터, 16개는 Callee-saved 레지스터로 사용됩니다.
| 종류 | 책임자 | 저장/복원 시점 |
|---|---|---|
| Caller-saved | Caller | 함수 호출 전 |
| Callee-saved | Callee | 함수 종료 시 |
| </aside> |
MIPS는 레지스터를 크게 두 가지 카테고리로 나눕니다.
<aside> 💡 원래 메모리 주소로 돌아갈 위치에 대한 저장과 복원임
</aside>
<aside>
💡 함수 호출 시 Caller와 Callee는 서로 다른 레지스터를 사용합니다.
Caller는 함수 호출 시 자신의 레지스터의 값을 스택에 저장하고, 함수 종료 시 스택에서 값을 복원합니다.
Callee는 함수 호출 시 Caller의 레지스터를 사용할 수 없기 때문에, 함수 종료 시 자신의 레지스터의 값을 Caller에게 반환해야 합니다.

근데 이렇게 함수 호출로 인한 다른 메모리 위치로 점프하는것은 결국 오버헤드를 발생시키는것이고, 이는 프로그램에게 친절한 방식은 아니다. (오버헤드로 인한 자리경쟁, 그로인한 miss가 그 이유?) 이러한 이유로, CPU에게는 다른 주소로의 점프 없이,(함수호출없이) 1차원으로만 진행되는 절차지향 언어가 더 적합하다는 것이다…
Caller-saved 레지스터의 경우
**Caller**가 함수 호출 시 자신의 레지스터를 스택에 저장합니다.
함수 종료 시 Caller는 스택에서 값을 복원하여 자신의 레지스터를 원래 상태로 되돌립니다.
Callee-saved 레지스터의 경우
Callee가 함수 종료 시 자신의 레지스터의 값을 Caller에게 반환합니다.
Caller는 Callee가 반환한 값을 자신의 레지스터에 저장하여 원래 상태로 되돌립니다.

</aside>