<aside> 💡 목차


</aside>

Caller 와 Callee

<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차원으로만 진행되는 절차지향 언어가 더 적합하다는 것이다…

근데 이렇게 함수 호출로 인한 다른 메모리 위치로 점프하는것은 결국 오버헤드를 발생시키는것이고, 이는 프로그램에게 친절한 방식은 아니다. (오버헤드로 인한 자리경쟁, 그로인한 miss가 그 이유?) 이러한 이유로, CPU에게는 다른 주소로의 점프 없이,(함수호출없이) 1차원으로만 진행되는 절차지향 언어가 더 적합하다는 것이다…

Caller-saved 레지스터의 경우

**Caller**가 함수 호출 시 자신의 레지스터를 스택에 저장합니다.

함수 종료 시 Caller는 스택에서 값을 복원하여 자신의 레지스터를 원래 상태로 되돌립니다.

Callee-saved 레지스터의 경우

Callee가 함수 종료 시 자신의 레지스터의 값을 Caller에게 반환합니다.

Caller는 Callee가 반환한 값을 자신의 레지스터에 저장하여 원래 상태로 되돌립니다.

Untitled

</aside>

컴퓨터구조에서의 Caller & Callee 설명

OOP에서의 Caller & Callee 설명