1.7 KiB
1.7 KiB
Code Generation 1
Organization of Storage
- Code Area
- Static Area
- Stack Area
- Heap Area
Stack Management using Register File
- Stack pointer (SP): points to the top of the frame
- Frame Pointer (FP, BP): points to the frame base
because stack frame size is not always known at compile time.
Saving Registers
The callee may overwrite useful values in the registers.
So caller's useful values should be stored in stack when function-call (push), and restored when callee return (pop). This role is done by both callee and caller (caller-saved, callee-saved).
- Caller-saved registers used to hold temporary quantities that need not be preserved across calls.
- Callee-saved registers used to hold long-lived values that should be preserved across calls.
So Code before call:
- push the params.
- push caller-saved registers
- push return address (curr
PC) and jump to callee code
Prologue of callee
- push dynamic link (
FP) - old stack pointer becomes new frame pointer
- push callee-saved registers
- push local var
Epilogue
- pop callee-saved registers
- store return value at appropriate place
- restore old stack pointer
- pop old frame pointer
- pop return addr and jump to that
Code after call
- pop caller-saved registers
- use return value from appropriate place
When accessing stack variable, use offsets from FP.
Global Variables or Static Variables
Global variables have same references for all scope. They are assigned a fixed address once (statically allocated).
Code > Static Data > Stack
Dynamic Allocation
The dynamically allocated value outlives the procedure creating it (unless deleted).
Code > Static Data > Stack -> <- Heap