beautypg.com

Zilog Z8F0130 User Manual

Page 241

background image

UM013037-1212

Function Call Mechanism: Static Frame

Zilog Developer Studio II – Z8 Encore!

User Manual

217

1. For a non-

varargs

function, load parameters into the corresponding static locations

for the function. For a

varargs

function, a dynamic frame is always used, and all

parameters are pushed on the stack in reverse order.

2. Then call the function. The call instruction pushes the return address on the top of the

stack.

3. On return from the function, the return address is automatically popped from the stack

by the

ret

instruction.

The called function performs the following tasks:

1. If the called function is a monitor function only, push the existing value of the inter-

rupt control register IRQCTL on the stack and disable interrupts.

2. Push the frame pointer onto the stack and set the frame pointer to the current value of

the stack pointer.

3. Execute the code for the function.

4. If the function returns a scalar value, place it in the return registers. For functions

returning an aggregate, see the

Special Cases

section on page 220.

5. Set the stack pointer to the current value of the frame pointer and restore the frame

pointer from the stack.

6. If the called function is a monitor function only, restore the interrupt control register

IRQCTL from the stack.

7. Return.

For a static frame function, steps 2 and 5 are only done if the

–debug

(Debug) or

–reduceopt

(Limit Optimizations for Easier Debugging) option is selected. All registers,

other than the return register, are considered as caller save, that is, they are saved and
restored by the caller function. The flag register is not saved and restored by the caller
function.

The preceding function call mechanism is a static call mechanism. The structure of a static
call frame is described in the

Structure of a Static Call Frame

section on page 217.

Structure of a Static Call Frame

For the static frame function

fun

, the local variables and parameters are allocated in a

frame labeled

_f_fun

for a large model and

_n_fun

for a small model. The parameters

are numbered from left to right and are named as _x_

fun

, in which x indicates the number

associated with the parameter. In the following example,

_0_fun

represents the left-most

parameter (

ch1

), and

_1_fun

represents the next parameter (

ch2

).