add L6.pdf and complement in 10.30
This commit is contained in:
68
notes/6.md
Normal file
68
notes/6.md
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
# 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`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
pdf/L6.pdf
Normal file
BIN
pdf/L6.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user