# Register usage across calls The registers are divided into two groups, according to how they are used across function calls: - Caller saved At a call site, the caller must assume that the callee changes the values of these registers. Therefore, the caller must save the values of these registers before making the call (if necessary), and restore them after the call. - Callee saved At a call site, the caller can assume that the callee does *not* change the values of these registers. Therefore, the callee must save and restore the values of these registers, if necessary. **Register usage across calls** | **Register** | **Usage** | **Saved by** | | --- | --- | --- | | R0 - R5 | Parameters ^a^ | – | | R6 - R15 | Scratch ^b^ | Caller | | R16 - R27 | Scratch | Callee | | R28 | Scratch ^b^ | Caller | | R29 - R31 | Stack frames | Callee ^c^ | | P3:0 | Processor state | Caller | ^a^ The callee can change parameter values ([Parameter passing](https://docs.qualcomm.com/doc/80-N2040-23/topic/parameter-passing.html#parameter-passing)). ^b^ R14-R15 and R28 are used by the procedure linkage table ([Procedure linkage table](https://docs.qualcomm.com/doc/80-N2040-23/topic/dynamic-linking.html#linkage-table)). ^c^ R29-R31 are saved and restored by allocframe and deallocframe ([Software stack](https://docs.qualcomm.com/doc/80-N2040-23/topic/abi-software-stack.html#software-stack)). ## Outgoing memory arguments The outgoing-memory-arguments section of the caller’s frame is caller-saved. In other words, the caller assumes that the callee will overwrite the values of parameters passed. This applies only to the outgoing memory arguments space used by the current call, and not to the total space allocated by the caller. Last Published: Oct 06, 2026 [Previous Topic Example:](https://docs.qualcomm.com/bundle/publicresource/80-N2040-23/topics/return-values.md) [Next Topic C++ exception handling](https://docs.qualcomm.com/bundle/publicresource/80-N2040-23/topics/cpp-exception-handling.md)