Download presentation
Presentation is loading. Please wait.
1
Code Generation Example Mooly Sagiv html://www.cs.tau.ac.il/~msagiv/courses/wcc06.html
2
Basic Compiler Phases
3
Outline A possible structure of the activation records Example compilation Executing the assembly code
4
Typical Virtual Memory Content Lower addresses static area Stack area Heap area Machine Registers
5
The problem The compiler needs to allocate memory for variables Consistent with program semantics –Scope –Duration –Recursion Efficient (moderate runtime cost) Solution?
6
A Typical Stack Frame
7
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Example Program
8
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part SP FP R03 R1 R2 main
9
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R03 R1 R2 Administrative part SP FP main fact
10
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R02 R1 R2 Administrative part SP FP main fact 5 3
11
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R02 R1 R2 Administrative part SP FP main fact 5 3 Administrative part fact 5
12
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R01 R1 R2 Administrative part SP FP main fact 5 3 Administrative part fact 5 2
13
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R01 R1 R2 Administrative part main fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5
14
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R00 R1 R2 Administrative part main fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 1
15
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R00 R1 R2 Administrative part main fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 Administrative part fact 5 1
16
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R01 R11 R2 Administrative part main fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 1
17
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R01 R12 R2 Administrative part main fact 5 3 Administrative part fact 5 2 SP FP
18
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R02 R13 R2 Administrative part main fact 5 3 SP FP
19
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R0x87 R16 R2 main SP FP x87 “%d\n”
20
void main() { printf(“%d\n”, fact(3)); } int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } Administrative part R0x87 R16 R2 main SP FP x87 “%d\n” Administrative part _printf
21
Register Instructions InstructionActions Load_Const c, RiRi=c Load_Local c(Ri), RjRj=*(Ri+c) Store_Local Ri, c(Rj)*(Rj+c)=Ri Add_Constant c, RiRi = Ri+c Add_Reg Ri, RjRj = Rj+Ri CMP Ri, RjCC = Ri -Rj CMP_Const C, RiCC = Ri - C Branch LPC = L; Branch_EQ Lif (CC==EQ) PC =L JSR L*(--SP) = FP; *(--SP) = PC; FP=SP-1;PC =L RTSPC=*(SP++); FP=*(SP++)
22
void main() { printf(“%d\n”, fact(3)); }. global _main Add_Constant -K1, SP L1: Load_Const 3, R0 JSR _fact Load_Reg R0, R1 Load_Const L2, R0 JSR _printf Add_Constant K1, SP RTS.data L2 : “%d\n”.end Code Generated for ‘main’
23
Code generated for ‘fact’ int fact(int n) { if (n==0) return 1; else return n * fact(n-1) ; } L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end
24
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part
25
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part fact
26
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part fact
27
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part fact
28
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part fact
29
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R03 R1 R2 main Administrative part fact 5 3
30
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part SP FP R02 R1 R2 main Administrative part fact 5 3
31
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part R02 R1 R2 main Administrative part fact 5 3 SP FP Administrative part
32
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end Administrative part R02 R1 R2 main Administrative part fact 5 3 SP FP Administrative part fact 5
33
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L6: Add_Constant K2, SP RTS.end R00 R1 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 Administrative part fact 5 1 Administrative part main
34
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 L6: Add_Constant K2, SP RTS.end R00 R1 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 Administrative part fact 5 1 Administrative part main
35
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 R01 R1 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 1 Administrative part main L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end
36
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 R01 R11 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 1 Administrative part main L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end
37
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 R01 R11 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part fact 5 1 Administrative part main L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end
38
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 R01 R11 R2 Administrative part fact 5 3 Administrative part fact 5 2 SP FP Administrative part main L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end
39
L4: Load_Constant 1, R0 Branch L6.global _fact Add _Constant -K2, SP L3: Cmp_Constant R0, 0 Branch_Eq L4 Branch L5 R02 R13 R2 Administrative part fact 5 3 SP FP Administrative part main L5: Store_Local R0, 5(FP) Sub_Constant 1, R0 JSR _fact Load_Local 5(FP), R1 Mult_Reg R1, R0 Branch L6 L6: Add_Constant K2, SP RTS.end
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.