beautypg.com

Zilog Z8F0130 User Manual

Page 243

background image

UM013037-1212

Function Call Mechanism: Register Parameter

Zilog Developer Studio II – Z8 Encore!

User Manual

219

1. For a non-

varargs

function, place the scalar parameters (not structures or unions) of

the called function in registers R8–R13 starting from left to right. Push the remaining
parameters including the nonscalar parameters on the stack for dynamic frame func-
tions or load into the static locations for static frame functions.

For a

varargs

function, a dynamic frame is always used, no parameter is passed in

register, 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.

4. On return from the called function, if there were any stack parameters, caller pops

them off the stack or increments the stack pointer.

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 allocate the local frame:

a.

Set the frame pointer to the current value of the stack pointer.

b. Decrement the stack pointer by the size of locals and temporaries on stack, if

required.

3. Execute the code for the function.

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

tions returning an aggregate, see the

Special Cases

section on page 220.

5. Deallocate the local frame (set the stack pointer to the current value of frame pointer),

if required, and restore the frame pointer from stack.

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

IRQCTL from the stack.

7. Return.

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. 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.

In the case of a monitor function, add (-1) to the offsets of all arguments on the stack to take
into account the insertion of the saved interrupt control register IRQCTL on the stack.

Note: