Winter 2006-2007 Compiler Construction T11 – Activation records + Introduction to x86 assembly Mooly Sagiv and Roman Manevich School of Computer Science.

Slides:



Advertisements
Similar presentations
The University of Adelaide, School of Computer Science
Advertisements

Intermediate Representation III. 2 PAs PA2 deadline is
C Programming and Assembly Language Janakiraman V – NITK Surathkal 2 nd August 2014.
Compiler Construction Intermediate Representation III Activation Records Ran Shaham and Ohad Shacham School of Computer Science Tel-Aviv University.
Assembly Language for Intel-Based Computers Chapter 8: Advanced Procedures Kip R. Irvine.
Lecture 10 – Activation Records Eran Yahav 1 Reference: Dragon 7.1,7.2. MCD 6.3,
Lecture 11 – Code Generation Eran Yahav 1 Reference: Dragon 8. MCD
University of Washington Last Time For loops  for loop → while loop → do-while loop → goto version  for loop → while loop → goto “jump to middle” version.
Compiler Construction Code Generation II Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University.
1 Storage Registers vs. memory Access to registers is much faster than access to memory Goal: store as much data as possible in registers Limitations/considerations:
Machine-Level Programming III: Procedures Apr. 17, 2006 Topics IA32 stack discipline Register saving conventions Creating pointers to local variables CS213.
PC hardware and x86 3/3/08 Frans Kaashoek MIT
1 ICS 51 Introductory Computer Organization Fall 2006 updated: Oct. 2, 2006.
Accessing parameters from the stack and calling functions.
– 1 – , F’02 ICS05 Instructor: Peter A. Dinda TA: Bin Lin Recitation 4.
Run time vs. Compile time
Compiler Construction Recap Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University.
Assembly תרגול 8 פונקציות והתקפת buffer.. Procedures (Functions) A procedure call involves passing both data and control from one part of the code to.
Compiler Construction Activation records Code Generation Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University.
Stack Activation Records Topics IA32 stack discipline Register saving conventions Creating pointers to local variables February 6, 2003 CSCE 212H Computer.
Compiler Construction Code Generation I Ran Shaham and Ohad Shacham School of Computer Science Tel-Aviv University.
CEG 320/520: Computer Organization and Assembly Language ProgrammingIntel Assembly 1 Intel IA-32 vs Motorola
6.828: PC hardware and x86 Frans Kaashoek
Dr. José M. Reyes Álamo 1.  The 80x86 memory addressing modes provide flexible access to memory, allowing you to easily access ◦ Variables ◦ Arrays ◦
Lecture 10 – Code Generation Eran Yahav 1 Reference: Dragon 8. MCD
Today’s topics Parameter passing on the system stack Parameter passing on the system stack Register indirect and base-indexed addressing modes Register.
Code Generation Gülfem Savrun Yeniçeri CS 142 (b) 02/26/2013.
CSc 453 Runtime Environments Saumya Debray The University of Arizona Tucson.
Fabián E. Bustamante, Spring 2007 Machine-Level Programming III - Procedures Today IA32 stack discipline Register saving conventions Creating pointers.
Assembly Language for Intel-Based Computers, 6 th Edition Chapter 8: Advanced Procedures (c) Pearson Education, All rights reserved. You may.
Languages and the Machine Chapter 5 CS221. Topics The Compilation Process The Assembly Process Linking and Loading Macros We will skip –Case Study: Extensions.
Code Generation III. PAs PA4 5.1 – 7.2 PA5 (bonus) 24.1 –
The x86 Architecture Lecture 15 Fri, Mar 4, 2005.
COP4020 Programming Languages Subroutines and Parameter Passing Prof. Xin Yuan.
Activation Records (in Tiger) CS 471 October 24, 2007.
Microprocessors The ia32 User Instruction Set Jan 31st, 2002.
Machine-level Programming III: Procedures Topics –IA32 stack discipline –Register saving conventions –Creating pointers to local variables.
CS412/413 Introduction to Compilers and Translators Spring ’99 Lecture 11: Functions and stack frames.
Intermediate Representation II Storage Allocation and Management EECS 483 – Lecture 18 University of Michigan Wednesday, November 8, 2006.
Functions/Methods in Assembly
Compiler Construction Code Generation Activation Records
University of Amsterdam Computer Systems – the instruction set architecture Arnoud Visser 1 Computer Systems The instruction set architecture.
Introduction to Intel IA-32 and IA-64 Instruction Set Architectures.
1 Assembly Language: Function Calls Jennifer Rexford.
Code Generation II. 2 Compiler IC Program ic x86 executable exe Lexical Analysis Syntax Analysis Parsing ASTSymbol Table etc. Inter. Rep. (IR) Code Generation.
Calling Procedures C calling conventions. Outline Procedures Procedure call mechanism Passing parameters Local variable storage C-Style procedures Recursion.
Winter Compiler Construction T10 – IR part 3 + Activation records Mooly Sagiv and Roman Manevich School of Computer Science Tel-Aviv University.
Reading Condition Codes (Cont.)
Assembly language.
Credits and Disclaimers
C function call conventions and the stack
143A: Principles of Operating Systems Lecture 4: Calling conventions
Introduction to Compilers Tim Teitelbaum
Assembly IA-32.
Machine-Level Programming 4 Procedures
BIC 10503: COMPUTER ARCHITECTURE
Stack Frames and Advanced Procedures
Introduction to Intel IA-32 and IA-64 Instruction Set Architectures
Machine-Level Programming III: Procedures Sept 18, 2001
MIPS Procedure Calls CSE 378 – Section 3.
Multi-modules programming
Week 2: Buffer Overflow Part 1.
X86 Assembly Review.
CSC 497/583 Advanced Topics in Computer Security
“Way easier than when we were students”
Credits and Disclaimers
Computer Architecture and System Programming Laboratory
Presentation transcript:

Winter Compiler Construction T11 – Activation records + Introduction to x86 assembly Mooly Sagiv and Roman Manevich School of Computer Science Tel-Aviv University

2 Today: PA4 tips Activation records Memory layout Introduction to x86 assembly Today IC Language ic Executable code exe Lexical Analysis Syntax Analysis Parsing ASTSymbol Table etc. Inter. Rep. (IR) Code Generation Next time: Code generation Register allocation Assembling Linking Activation records in depth PA5

3 Tips for PA4 Keep list of LIR instructions for each translated method Keep ClassLayout information for each class Field offsets Method offsets Don’t forget to take superclass fields and methods into account May be useful to keep reference in each LIR instruction to AST node from which it was generated Two AST passes: Pass 1: collect and name strings literals ( Map ), create ClassLayout for each class Pass 2: use literals and field/method offsets to translate method bodies Finally: print string literals, dispatch tables, print translation list of each method body

4 Roadmap PA4 (HIR/LIR) LIR data: string literals, dispatch vectors Array access and field access instructions Call/return primitives LIR registers LIR file (file.lir) generation PA5 (ASM) Static information: string literals, dispatch tables Handlers for runtime errors (here or in PA4) Call sequences Dynamic binding mechanism Machine registers Assembly file (file.s) generation

5 LIR vs. assembly LIRAssembly #RegistersUnlimitedLimited Function callsImplicitRuntime stack Instruction setAbstractConcrete TypesBasic and user defined Limited basic types local variables, parameters, LIR registers

6 Function calls LIR – simply call/return Conceptually Supply new environment (frame) with temporary memory for local variables Pass parameters to new environment Transfer flow of control (call/return) Return information from new environment (ret. value) Assembly – pass parameters (+ this ), save registers, call, virtual method lookup, restore registers, pass return value, return

7 Activation records New environment = activation record (frame) Activation record = data of current function / method call User data Local variables Parameters Return values Register contents Administration data Code addresses Pointers to other activation records (not needed for IC) In IC – a stack is sufficient!

8 Runtime stack Stack of activation records Call = push new activation record Return = pop activation record Only one “active” activation record – top of stack Naturally handles recursion

9 Runtime stack Stack grows downwards (towards smaller addresses) SP – stack pointer – Top of current frame FP – frame pointer – Base of current frame Sometimes called BP (base pointer) Current frame …… Previous frame SP FP

10 x86 runtime stack support RegisterUsage ESPStack pointer EBPBase pointer InstructionUsage push, pusha,…Push on runtime stack pop, popa,…Pop from runtime stack callTransfer control to called routine retTransfer control back to caller Pentium stack registers x86 stack and call/ret instructions

11 The processor does not save the content of registers on procedure calls So who will? Caller saves and restores registers Callee saves and restores registers But can also have both save/restore some registers Some conventions exist (e.g., cdecl) Call sequences

12 call caller callee return caller Caller push code Callee push code (prologue) Callee pop code (epilogue) Caller pop code Push caller-save registers Push actual parameters (in reverse order) push return address Jump to call address Push current base-pointer bp = sp Push local variables Push callee-save registers Pop callee-save registers Pop callee activation record Pop old base-pointer pop return address Jump to address Pop parameters Pop caller-save registers Call sequences

13 call caller callee return caller push %ecx push $21 push $42 call _foo push %ebp mov %esp, %ebp sub $8, %esp push %ebx pop %ebx mov %ebp, %esp pop %ebp ret add $8, %esp pop %ecx Push caller-save registers Push actual parameters (in reverse order) push return address Jump to call address Push current base-pointer bp = sp Push local variables (callee variables) Push callee-save registers Pop callee-save registers Pop callee activation record Pop old base-pointer pop return address Jump to address Pop parameters Pop caller-save registers Call sequences – foo(42,21)

14 Caller-save/callee-save convention Callee-saved registers need only be saved when callee modifies their value Some conventions exist (e.g., cdecl) %eax, %ecx, %edx – caller save %ebx, %esi, %edi – callee save %esp – stack pointer %ebp – frame pointer %eax – procedure return value

15 Accessing stack variables Use offset from EBP Remember – stack grows downwards Above EBP = parameters Below EBP = locals Examples %ebp + 4 = return address %ebp + 8 = first parameter %ebp – 4 = first local …… SP FP Return address Param n … param1 Local 1 … Local n Previous fp Param n … param1 FP+8 FP-4

16 main calling method bar Examples %ebp + 4 = return address %ebp + 8 = first parameter Always this in virtual function calls %ebp = old %ebp (pushed by callee) %ebp – 4 = first local …… ESP, EBP Return address Previous fp EBP+8 EBP-4 this ≈ a 31 EBP+12 y main’s frame bar’s frame int bar(int x) { int y; … } static void main(string[] args) { int z; Foo a = new Foo(); z = a.bar(31); … }

17 main calling method bar Examples %ebp + 4 = return address %ebp + 8 = first parameter Always this in virtual function calls %ebp = old %ebp (pushed by callee) %ebp – 4 = first local …… ESP, EBP Return address Previous fp EBP+8 EBP-4 this ≈ a 31 EBP+12 y main’s frame bar’s frame int bar(Foo this, int x) { int y; … } static void main(string[] args) { int z; Foo a = new Foo(); z = a.bar(a,31); … } implicit parameter implicit argument

18 Conceptual memory layout Param 1 … Param n Return address Previous FP Local 1 … Local k Stack variables Global 1 … Global m Global variables Heap locations

19 Memory segments layout Code Static area Stack Heap Globals and static data: strings, dispatch tables Activation records: locals, parameters etc. Dynamically allocated data: objects, arrays Data layout and addresses known in advance (compile time)

20 x86 assembly AT&T syntax and Intel syntax We’ll be using AT&T syntax Work with GNU Assembler (GAS)GNU Assembler AT&TIntel Order of operandsop a,b means b = a op b (second operand is destination) op a, b means a = a op b (first operand is destination) Memory addressingdisp(base, offset, scale)[base + offset * scale + disp] Size of memory operandsinstruction suffixes (b,w,l) (e.g., movb, movw, movl) operand prefixes (e.g., byte ptr, word ptr, dword ptr) Registers%eax, %ebx, etc.eax, ebx, etc. Constants$4, $foo, etc4, foo, etc Summary of differences

21 IA-32 registers Eight 32-bit general-purpose registers EAX, EBX, ECX, EDX, ESI, EDI EBP – stack frame (base) pointer ESP – stack pointer EFLAGS register – info on results of arithmetic operations EIP (instruction pointer) register Six 16-bit segment registers We ignore the rest

22 Register roles EAX Accumulator for operands and result data Required operand of MUL, IMUL, DIV and IDIV instructions Contains the result of these operations Used to store procedure return value EBX Pointer to data, often used as array-base address ECX Counter for string and loop operations EDX Stores remainder of a DIV or IDIV instruction (EAX stores quotient) ESI, EDI ESI – required source pointer for string instructions EDI – required destination pointer for string instructions Destination registers for arithmetic operations EAX, EBX, ECX, EDX EBP – stack frame (base) pointer ESP – stack pointer

23 InstructionOperandsMeaning add Reg,Reg imd,Reg mem,Reg Addition sub Reg,Reg imd,Reg mem,Reg inc RegIncrement value in register dec RegDecrement value in register neg RegNegate mul Reg, %eax imd, %eax mem, %eax Unsigned multiplication imul Reg Reg, %eax imd, %eax mem, %eax Signed multiplication eax=eax*Reg idiv RegSigned division eax=quo, edx=rem eax / Reg Sample of x86 instructions

24 IA-32 addressing modes Machine-instructions take zero or more operands (usually allow at most one memory operand) Source operand Immediate Register Memory location (I/O port) Destination operand Register Memory location (I/O port)

25 Immediate and register operands Immediate Value specified in the instruction itself GAS syntax – immediate values preceded by $ Example: add $4,%esp Register Register name is used GAS syntax – register names preceded with % Example: mov %esp,%ebp

26 Memory and base displacement operands Memory operands Obtain value at given address GAS syntax – parentheses Example: mov (%eax), %eax Base displacement Obtain value at computed address Address computed out of base register, index register, scale factor, displacement offset = base + (index * scale) + displacement Syntax: disp(base,index,scale) Example: mov $42,2(%eax) Example: mov $42,1(%eax,%ecx,4)

27 Representing strings and arrays Each string preceded by a word indicating the length of the string Array length stored in memory word preceding base address (i.e., the location at offset -4 ) Project-wise String literals allocated statically, concatenation using __stringCat Use __allocateArray to allocate arrays NOTICE: accepts number of bytes not including the length word Hello world\13 String reference n 1

28 Base displacement addressing mov (%ecx,%ebx,4), %eax 7 Array base reference %ecx = base %ebx = 3 offset = base + (index * scale) + displacement offset = base + (3*4) + 0 = base + 12 (%ecx,%ebx,4)

29 Instruction examples Translate a=p+q into mov 16(%ebp),%ecx (load) add 8(%ebp),%ecx (arithmetic) mov %ecx,-8(%ebp) (store) Translate a=12 into mov $12,-8(%ebp) Accessing strings: str:.string “Hello world!” access as constant: push $str Array access: a[i]=1 mov -4(%ebp),%ebx (load a ) mov -8(%ebp),%ecx (load i ) mov $1,(%ebx,%ecx,4) (store into the heap) Jumps: Unconditional: jmp label2 Conditional: cmp %ecx,0 jnz L

30 Runtime check example Suppose we have an array access statement …=v[i] or v[i]=… In LIR: MoveArray R1[R2],… or MoveArray …,R1[R2] We have to check that 0 ≤ i < v.length cmp $0,-12(%ebp) (compare i to 0 ) jl ArrayBoundsError (test lower bound) mov -8(%ebp),%ecx (load v into %ecx ) mov -4(%ecx),%ecx (load array length into %ecx ) cmp -12(%ebp),%ecx (compare i to array length) jle ArrayBoundsError (test upper bound)

31 class Library { void println(string s); } class Hello { static void main(string[] args) { Library.println("Hello world!"); } Hello world example

32 Assembly file structure.title"hello.ic“ # global declarations.global __ic_main # data section.data.align 4.int 13 str1:.string "Hello world\n“ # text (code) section.text # align 4 __ic_main: push %ebp # prologue mov %esp,%ebp push $str1 # print(...) call __print add $4, %esp mov $0,%eax# return 0 mov %ebp,%esp# epilogue pop %ebp ret header statically-allocated data: string literals and dispatch tables symbol exported to linker Method bodies and error handlers string length in bytes comment

33 Assembly file structure.title"hello.ic“ # global declarations.global __ic_main # data section.data.align 4.int 13 str1:.string "Hello world\n“ # text (code) section.text # align 4 __ic_main: push %ebp # prologue mov %esp,%ebp push $str1 # print(...) call __print add $4, %esp mov $0,%eax# return 0 mov %ebp,%esp# epilogue pop %ebp ret Immediates have $ prefix Register names have % prefix Comments using # Labels end with the (standard) : push print parameter call print pop parameter store return value of main in eax prologue – save ebp and set to be esp epilogue – restore esp and ebp (pop)

34 Calls/returns Direct function call syntax: call name Example: call __println Return instruction: ret

35 Virtual functions Indirect call: call *( Reg ) Example: call *(%eax) Used for virtual function calls Dispatch table lookup Passing/receiving the this variable More on this next time

36 See you next week