add L6.pdf and complement in 10.30

This commit is contained in:
2025-10-30 09:58:04 +09:00
parent 2a7cb64862
commit 0f3b235e99
2 changed files with 68 additions and 0 deletions

68
notes/6.md Normal file
View 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`