diff --git a/notes/6.md b/notes/6.md new file mode 100644 index 0000000..2486956 --- /dev/null +++ b/notes/6.md @@ -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` + + + diff --git a/pdf/L6.pdf b/pdf/L6.pdf new file mode 100644 index 0000000..a8ac220 Binary files /dev/null and b/pdf/L6.pdf differ