The caller is responsible for saving and restoring caller-saved registers before making a function call.

Conversely, the callee is responsible for preserving the values of callee-saved registers.

We can understand this convention from two perspectives:

  • Caller’s perspective: The caller should assume that all caller-saved registers may be overwritten by the callee. However, callee-saved registers will retain their original values.
  • Callee’s perspective: The callee is free to use any caller-saved registers without extra work. However, if it needs to use a callee-saved register, it must ensure the register’s original value is restored before returning. This can be done by saving the register’s value to the stack in the function prologue and restoring it in the epilogue.

See Also