| |||
| Home > Directives Reference > Frame description directives > FRAME ADDRESS | |||
The FRAME ADDRESS directive describes how to
calculate the canonical frame address for following instructions.
You can only use it in functions with FUNCTION and ENDFUNC or PROC and ENDP directives.
FRAME ADDRESSreg[,offset]
where:
regis the register on which the canonical frame address is to be based. This is sp unless the function uses a separate frame pointer.
offsetis the offset of the canonical frame address from .
If reg is zero,
you can omit it.offset
Use FRAME ADDRESS if your code alters which register
the canonical frame address is based on, or if it alters the offset
of the canonical frame address from the register. You must use FRAME
ADDRESS immediately after the instruction which changes the
calculation of the canonical frame address.
If your code uses a single instruction to save registers and
alter the stack pointer, you can use FRAME PUSH instead
of using both FRAME ADDRESS and FRAME SAVE (see FRAME PUSH).
If your code uses a single instruction to load registers and
alter the stack pointer, you can use FRAME POP instead
of using both FRAME ADDRESS and FRAME RESTORE (see FRAME POP).
_fn FUNCTION ; CFA (Canonical Frame Address) is value
; of sp on entry to function
STMFD sp!, {r4,fp,ip,lr,pc}
FRAME PUSH {r4,fp,ip,lr,pc}
SUB sp,sp,#4 ; CFA offset now changed
FRAME ADDRESS sp,24 ; - so we correct it
ADD fp,sp,#20
FRAME ADDRESS fp,4 ; New base register
; code using fp to base call-frame on, instead of sp