5.8.7 Calling Functions
All 8-bit devices use a hardware stack for function return addresses. The maximum depth of this stack varies from device to device.
Typically, call assembly instructions are used to transfer control to a C
function when it is called. A call uses one level of hardware stack that is freed after the
called routine executes a return
or retlw
instruction.
Nested function calls will increase the stack usage of a program. If the hardware stack
overflows, function return addresses will be overwritten and the code will eventually
fail.
For PIC18 devices, a call instruction is the only way in which function
calls are made, but for other 8-bit devices, the -mstackcall
option, (see
4.6.1.24 Stackcall Option), can controls
how the compiler behaves when the compiler detects that the hardware stack might overflow
due to too many nested calls. When this option is enabled, the compiler will, instead of
issuing a warning, automatically swap to using a managed stack that involves the use of a
lookup table and which does not require use of the hardware stack.
When the lookup method is being employed, a function is reached by a jump (not a call) directly to its address. Before this is done the address of a special “return” instruction (implemented as a jump instruction) is stored in a temporary location inside the called function. This return instruction will be able to return control back to the calling function.
This means of calling functions allows functions to be nested deeply without overflowing the limited stack available on Baseline and Mid-range devices; however, it does come at the expense of memory and program speed.