CS 3214 Computer Systems Lecture 2 Godmar Back.

Slides:



Advertisements
Similar presentations
Fabián E. Bustamante, Spring 2007 Machine-Level Programming – Introduction Today Assembly programmer’s exec model Accessing information Arithmetic operations.
Advertisements

Machine/Assembler Language Putting It All Together Noah Mendelsohn Tufts University Web:
Machine Programming I: Basics
Machine-Level Programming I: Basics
Machine Programming – Procedures and IA32 Stack CENG334: Introduction to Operating Systems Instructor: Erol Sahin Acknowledgement: Most of the slides are.
University of Washington Instruction Set Architectures ISAs Brief history of processors and architectures C, assembly, machine code Assembly basics: registers,
Instruction Set Architectures
Machine-Level Programming I: Introduction Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations CS.
Machine-Level Programming I: Introduction January 29, 2002 Topics Assembly Programmer’s Execution Model Accessing Information –Registers –Memory Arithmetic.
Machine-Level Programming I: Introduction Sept. 10, 2002 Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic.
Machine-Level Programming I: Introduction
Machine-Level Programming I: Introduction Jan 27, 2004 Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations.
Machine-Level Programming I: Introduction Apr. 10, 2006 Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic.
Machine-Level Programming I: Introduction Apr. 14, 2008 Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic.
Machine-Level Programming I: Introduction Sept. 14, 2004 Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic.
C Prog. To Object Code text text binary binary Code in files p1.c p2.c
Machine-Level Programming I: Introduction Sept. 10, 2007 Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic.
Machine-Level Programming I: Introduction Sept. 10, 2002 Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic.
1 Machine-Level Programming I: Basics Computer Systems Organization Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron.
II:1 X86 Assembly - Data. II:2 Admin Quiz?  What happened?  Make-up options? Several missing from lab Attendance at lab is required Passing grade without.
64-Bit Architectures Topics 64-bit data New registers and instructions Calling conventions CS 105 “Tour of the Black Holes of Computing!”
Machine-Level Programming I: Introduction Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations.
Machine-Level Programming I: Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations X86.1.ppt CS 105.
Machine-Level Programming 1 Introduction Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations.
Machine-Level Programming I: Introduction Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations CS.
Carnegie Mellon 1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Machine-Level Programming I: Basics Sep. 15, 2015.
University of Washington Roadmap 1 car *c = malloc(sizeof(car)); c->miles = 100; c->gals = 17; float mpg = get_mpg(c); free(c); Car c = new Car(); c.setMiles(100);
University of Washington Roadmap 1 car *c = malloc(sizeof(car)); c->miles = 100; c->gals = 17; float mpg = get_mpg(c); free(c); Car c = new Car(); c.setMiles(100);
Machine-Level Programming I: Introduction Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations.
Machine-Level Programming I: Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations CS 105 “Tour of.
University of Washington Basics of Machine Programming The Hardware/Software Interface CSE351 Winter 2013.
Machine-Level Programming I: Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations CS 105 “Tour of.
Machine-Level Programming 1 Introduction Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations.
Machine-Level Programming I: Introduction Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations.
University of Washington x86 Programming I The Hardware/Software Interface CSE351 Winter 2013.
Carnegie Mellon 1 Machine-Level Programming I: Basics Lecture, Feb. 21, 2013 These slides are from website which accompanies the.
IA32 Stack –Region of memory managed with stack discipline –Grows toward lower addresses –Register %esp indicates lowest stack address address of top element.
Machine-Level Programming I: Introduction Jan. 30, 2001 Topics Assembly Programmer’s Execution Model Accessing Information –Registers –Memory Arithmetic.
Machine-Level Programming I: IA32 Assembly Language Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations.
A job ad at a game programming company
Machine-Level Programming I: Basics
X86 Assembly - Data.
ISAs and Microarchitectures
Reading Condition Codes (Cont.)
Instruction Set Architecture
Machine-Level Programming I:
Machine-Level Programming I:
Machine-Level Programming I: Basics
Credits and Disclaimers
IA32 Processors Evolutionary Design
Machine-Level Programming II: Arithmetic & Control
Machine-Level Programming 1 Introduction
Instructor: David Ferry
C Prog. To Object Code text text binary binary Code in files p1.c p2.c
Machine-Level Programming III: Procedures Sept 18, 2001
Authors: Randal E. Bryant and David R. O’Hallaron
Machine-Level Programming I: Introduction Feb. 1, 2000
Machine-Level Programming I: Introduction
X86 Assembly - Data.
Machine-Level Programming: Introduction
Machine-Level Programming II: Basics Comp 21000: Introduction to Computer Organization & Systems Instructor: John Barr * Modified slides from the book.
Machine-Level Programming I: Basics
Machine-Level Programming II: Basics Comp 21000: Introduction to Computer Organization & Systems Spring 2016 Instructor: John Barr * Modified slides.
Machine-Level Programming I:
Machine-Level Programming I:
The von Neumann Machine
Credits and Disclaimers
Machine-Level Programming I: Introduction Sept. 10, 2002
Presentation transcript:

CS 3214 Computer Systems Lecture 2 Godmar Back

Announcements Exercise 1 due Aug 30 Project 1 due Sep 7 Team Up Now Should now have access to systems lab (McB 124) via keycard Has Unix workstations for you to use Send email to me if it doesn’t work CS 3214 Fall 2011

The following slides are taken with permission from Complete Powerpoint Lecture Notes for Computer Systems: A Programmer's Perspective 2nd Edition (CS:APP 2e) Randal E. Bryant and David R. O'Hallaron http://csapp.cs.cmu.edu/public/instructors.html Part 1 Programs and Data CS 3214 Fall 2011

Goals Study IA32 architecture and x86_64 64-bit extension Most widely used Study Assembly Programmer’s View Study C Programmer’s View CS 3214 Fall 2011

Intel x86 Processors: Overview Architectures Processors X86-16 8086 286 X86-32/IA32 386 486 Pentium Pentium MMX Pentium III Pentium 4 Pentium 4E MMX SSE SSE2 SSE3 X86-64 / EM64t Pentium 4F Core 2 Duo Core i7 time SSE4 CS 3214 Fall 2011

Intel x86 Processors, contd. Machine Evolution 386 1985 0.3M Pentium 1993 3.1M Pentium/MMX 1997 4.5M PentiumPro 1995 6.5M Pentium III 1999 8.2M Pentium 4 2001 42M Core 2 Duo 2006 291M Core i7 2008 731M Added Features Instructions to support multimedia operations Parallel operations on 1, 2, and 4-byte data, both integer & FP Instructions to enable more efficient conditional operations Linux/GCC Evolution Two major steps: 1) support 32-bit 386. 2) support 64-bit x86-64 CS 3214 Fall 2011

IA64/Itanium Itanium 2001 10M Itanium 2 2002 221M First shot at 64-bit architecture: first called IA64 Radically new instruction set designed for high performance Can run existing IA32 programs On-board “x86 engine” Joint project with Hewlett-Packard Itanium 2 2002 221M Big performance boost Itanium 2 Dual-Core 2006 1.7B Itanium has not taken off in marketplace Lack of backward compatibility, no good compiler support, Pentium 4 got too good CS 3214 Fall 2011

x86 Clones: Advanced Micro Devices (AMD) Historically AMD has followed just behind Intel A little bit slower, a lot cheaper Then Recruited top circuit designers from Digital Equipment Corp. and other downward trending companies Built Opteron: tough competitor to Pentium 4 Developed x86-64, their own extension to 64 bits CS 3214 Fall 2011

Intel’s 64-Bit Story Intel Attempted Radical Shift from IA32 to IA64 Totally different architecture (Itanium) Executes IA32 code only as legacy Performance disappointing AMD Stepped in with Evolutionary Solution x86-64 (now called “AMD64”) Intel Felt Obligated to Focus on IA64 Hard to admit mistake or that AMD is better 2004: Intel Announces EM64T extension to IA32 Extended Memory 64-bit Technology Almost identical to x86-64! All but low-end x86 processors support x86-64 But, lots of code still runs in 32-bit mode CS 3214 Fall 2011

Our Coverage IA32 x86-64/EM64T Presentation The traditional x86 (Project 2!) x86-64/EM64T The emerging standard (Project 1!) Presentation Book presents IA32 in Sections 3.1—3.12 Covers x86-64 in 3.13 We will cover both simultaneously Some labs will be based on x86-64, others on IA32 CS 3214 Fall 2011

Assembly Programmer’s View CPU Memory Addresses Registers E I P Object Code Program Data OS Data Data Condition Codes Instructions Stack Programmer-Visible State EIP/RIP Program Counter Address of next instruction Register File Heavily used program data Condition Codes Store status information about most recent arithmetic operation Used for conditional branching Memory Byte addressable array Code, user data, (some) OS data Includes stack used to support procedures CS 3214 Fall 2011

Turning C into Object Code Code in files p1.c p2.c Compile with command: gcc -O p1.c p2.c -o p Use optimizations (-O) Put resulting binary in file p text C program (p1.c p2.c) Compiler (gcc -S) Asm program (p1.s p2.s) text Assembler (gcc or as) binary Object program (p1.o p2.o) Static libraries (.a) Linker (gcc or ld) binary Executable program (p) CS 3214 Fall 2011

Compiling Into Assembly C Code Generated Assembly int sum(int x, int y) { int t = x+y; return t; } sum: pushl %ebp movl %esp,%ebp movl 12(%ebp),%eax addl 8(%ebp),%eax movl %ebp,%esp popl %ebp ret Obtain with command gcc –m32 -O -S code.c Produces file code.s gcc –m32 produces 32-bit code gcc –m64 produces 64-bit code (Default on rlogin cluster!) CS 3214 Fall 2011

Assembly Characteristics Minimal Data Types “Integer” data of 1, 2, 4, or 8 bytes Data values Addresses (untyped pointers) Floating point data of 4, 8, or 10 bytes No aggregate types such as arrays or structures Just contiguously allocated bytes in memory Primitive Operations Perform arithmetic function on register or memory data Transfer data between memory and register Load data from memory into register Store register data into memory Transfer control Unconditional jumps to/from procedures Conditional branches CS 3214 Fall 2011

Object Code Assembler Linker Code for sum Translates .s into .o Binary encoding of each instruction Nearly-complete image of executable code Missing linkages between code in different files Linker Resolves references between files Combines with static run-time libraries E.g., code for malloc, printf Some libraries are dynamically linked Linking occurs when program begins execution Code for sum 0x401040 <sum>: 0x55 0x89 0xe5 0x8b 0x45 0x0c 0x03 0x08 0xec 0x5d 0xc3 Total of 13 bytes Each instruction 1, 2, or 3 bytes Starts at address 0x401040 CS 3214 Fall 2011

Machine Instruction Example C Code Add two signed integers Assembly Add 2 4-byte integers “Long” words in GCC parlance Same instruction whether signed or unsigned Operands: x: Register %eax y: Memory M[%ebp+8] t: Register %eax Return function value in %eax Object Code 3-byte instruction Stored at address 0x401046 int t = x+y; addl 8(%ebp),%eax Similar to expression x += y Or more precisely: int eax; int *ebp; eax += ebp[2]; 0x401046: 03 45 08 CS 3214 Fall 2011

Disassembling Object Code 00401040 <sum>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 8b 45 0c mov 0xc(%ebp),%eax 6: 03 45 08 add 0x8(%ebp),%eax 9: 89 ec mov %ebp,%esp b: 5d pop %ebp c: c3 ret d: 8d 76 00 lea 0x0(%esi),%esi Disassembler objdump -d p Useful tool for examining object code Analyzes bit pattern of series of instructions Produces approximate rendition of assembly code Can be run on either a.out (complete executable) or .o file CS 3214 Fall 2011

Alternate Disassembly Disassembled Object 0x401040 <sum>: push %ebp 0x401041 <sum+1>: mov %esp,%ebp 0x401043 <sum+3>: mov 0xc(%ebp),%eax 0x401046 <sum+6>: add 0x8(%ebp),%eax 0x401049 <sum+9>: mov %ebp,%esp 0x40104b <sum+11>: pop %ebp 0x40104c <sum+12>: ret 0x40104d <sum+13>: lea 0x0(%esi),%esi 0x401040: 0x55 0x89 0xe5 0x8b 0x45 0x0c 0x03 0x08 0xec 0x5d 0xc3 Within gdb Debugger gdb p disassemble sum Disassemble procedure (works only for functions in the symbol table, else use x/i or x/20i …) x/13b sum Examine the 13 bytes starting at sum CS 3214 Fall 2011

Integer Registers (IA32) Origin (mostly obsolete) %eax %ecx %edx %ebx %esi %edi %esp %ebp %ax %ah %al accumulate %cx %ch %cl counter %dx %dh %dl data general purpose %bx %bh %bl base source index %si destination index %di stack pointer %sp base pointer %bp 16-bit virtual registers (backwards compatibility)

Integer Registers (IA32) Eniac Accumulator (1 decimal digit) Origin (mostly obsolete) %eax %ecx %edx %ebx %esi %edi %esp %ebp %ax %ah %al accumulate %cx %ch %cl counter %dx %dh %dl data general purpose %bx %bh %bl base source index %si destination index %di stack pointer %sp base pointer %bp 16-bit virtual registers (backwards compatibility)

Intel’s Idea of a “word” Most 32-bit machines today use 32-bit words. But x86 dates from a 16-bit world. Words Bytes Bits Suffix Registers 32-bit C 64-bit C ½ 1 8 b, e.g. movb ah, al, … char 2 16 w, e.g., movw ax, bx, si, .. short 4 32 l for ‘long’ as in movl (*) eax, ebx, esi, … int long int 64 q for ‘quad’ rax, rbx, …. long long long long long (*) Microsoft/Intel calls this a “double word” CS 3214 Fall 2011

Moving Data Moving Data Operand Types movl Source,Dest: %eax %edx %ecx %ebx %esi %edi %esp %ebp Moving Data movl Source,Dest: Move 4-byte (“long”) word Lots of these in typical code Operand Types Immediate: Constant integer data Like C constant, but prefixed with ‘$’ E.g., $0x400, $-533 Encoded with 1, 2, or 4 bytes Register: One of 8 integer registers (x86_64:16) But %esp and %ebp reserved for special use (not in x86_64) Others have special uses for particular instructions Memory: 4 consecutive bytes of memory Various “address modes” CS 3214 Fall 2011

movl Operand Combinations Source Destination C Analog Reg movl $0x4,%eax temp = 0x4; Imm Mem movl $-147,(%eax) *p = -147; Reg movl %eax,%edx temp2 = temp1; movl Reg Mem movl %eax,(%edx) *p = temp; Mem Reg movl (%eax),%edx temp = *p; Cannot do memory-memory transfers with single instruction CS 3214 Fall 2011

Simple Addressing Modes Normal (R) Mem[Reg[R]] Register R specifies memory address movl (%ecx),%eax Displacement D(R) Mem[Reg[R]+D] Register R specifies start of memory region Constant displacement D specifies offset movl 8(%ebp),%edx CS 3214 Fall 2011

Using Simple Addressing Modes swap: pushl %ebp movl %esp,%ebp pushl %ebx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx),%eax movl (%edx),%ebx movl %eax,(%edx) movl %ebx,(%ecx) movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret Set Up void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; } Body Finish CS 3214 Fall 2011

Understanding Swap Stack yp xp Rtn adr Old %ebp %ebp 4 8 12 Offset • 4 8 12 Offset • Old %ebx -4 void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; } Stack Register Variable %ecx yp %edx xp %eax t1 %ebx t0 movl 12(%ebp),%ecx # ecx = yp movl 8(%ebp),%edx # edx = xp movl (%ecx),%eax # eax = *yp (t1) movl (%edx),%ebx # ebx = *xp (t0) movl %eax,(%edx) # *xp = eax movl %ebx,(%ecx) # *yp = ebx CS 3214 Fall 2011

Understanding Swap Address 123 0x124 456 0x120 0x11c %eax %edx %ecx %ebx %esi %edi %esp %ebp 0x104 0x118 Offset 0x114 yp 12 0x120 0x110 xp 8 0x124 0x10c 4 Rtn adr 0x108 %ebp 0x104 -4 0x100 movl 12(%ebp),%ecx # ecx = yp movl 8(%ebp),%edx # edx = xp movl (%ecx),%eax # eax = *yp (t1) movl (%edx),%ebx # ebx = *xp (t0) movl %eax,(%edx) # *xp = eax movl %ebx,(%ecx) # *yp = ebx CS 3214 Fall 2011

Understanding Swap Address 123 0x124 456 0x120 0x11c %eax %edx %ecx %ebx %esi %edi %esp %ebp 0x120 0x104 0x118 Offset 0x114 yp 12 0x120 0x110 xp 8 0x124 0x10c 4 Rtn adr 0x108 %ebp 0x104 -4 0x100 movl 12(%ebp),%ecx # ecx = yp movl 8(%ebp),%edx # edx = xp movl (%ecx),%eax # eax = *yp (t1) movl (%edx),%ebx # ebx = *xp (t0) movl %eax,(%edx) # *xp = eax movl %ebx,(%ecx) # *yp = ebx CS 3214 Fall 2011

Understanding Swap Address 123 0x124 456 0x120 0x11c %eax %edx %ecx %ebx %esi %edi %esp %ebp 0x124 0x120 0x104 0x118 Offset 0x114 yp 12 0x120 0x110 xp 8 0x124 0x10c 4 Rtn adr 0x108 %ebp 0x104 -4 0x100 movl 12(%ebp),%ecx # ecx = yp movl 8(%ebp),%edx # edx = xp movl (%ecx),%eax # eax = *yp (t1) movl (%edx),%ebx # ebx = *xp (t0) movl %eax,(%edx) # *xp = eax movl %ebx,(%ecx) # *yp = ebx CS 3214 Fall 2011

Understanding Swap Address 123 0x124 456 0x120 0x11c %eax %edx %ecx %ebx %esi %edi %esp %ebp 456 0x124 0x120 0x104 0x118 Offset 0x114 yp 12 0x120 0x110 xp 8 0x124 0x10c 4 Rtn adr 0x108 %ebp 0x104 -4 0x100 movl 12(%ebp),%ecx # ecx = yp movl 8(%ebp),%edx # edx = xp movl (%ecx),%eax # eax = *yp (t1) movl (%edx),%ebx # ebx = *xp (t0) movl %eax,(%edx) # *xp = eax movl %ebx,(%ecx) # *yp = ebx CS 3214 Fall 2011

Understanding Swap Address 123 0x124 456 0x120 0x11c %eax %edx %ecx %ebx %esi %edi %esp %ebp 456 0x124 0x120 123 0x104 0x118 Offset 0x114 yp 12 0x120 0x110 xp 8 0x124 0x10c 4 Rtn adr 0x108 %ebp 0x104 -4 0x100 movl 12(%ebp),%ecx # ecx = yp movl 8(%ebp),%edx # edx = xp movl (%ecx),%eax # eax = *yp (t1) movl (%edx),%ebx # ebx = *xp (t0) movl %eax,(%edx) # *xp = eax movl %ebx,(%ecx) # *yp = ebx CS 3214 Fall 2011

Understanding Swap Address 456 0x124 456 0x120 0x11c %eax %edx %ecx %ebx %esi %edi %esp %ebp 456 0x124 0x120 123 0x104 0x118 Offset 0x114 yp 12 0x120 0x110 xp 8 0x124 0x10c 4 Rtn adr 0x108 %ebp 0x104 -4 0x100 movl 12(%ebp),%ecx # ecx = yp movl 8(%ebp),%edx # edx = xp movl (%ecx),%eax # eax = *yp (t1) movl (%edx),%ebx # ebx = *xp (t0) movl %eax,(%edx) # *xp = eax movl %ebx,(%ecx) # *yp = ebx CS 3214 Fall 2011

Understanding Swap Address 456 0x124 123 0x120 0x11c %eax %edx %ecx %ebx %esi %edi %esp %ebp 456 0x124 0x120 123 0x104 0x118 Offset 0x114 yp 12 0x120 0x110 xp 8 0x124 0x10c 4 Rtn adr 0x108 %ebp 0x104 -4 0x100 movl 12(%ebp),%ecx # ecx = yp movl 8(%ebp),%edx # edx = xp movl (%ecx),%eax # eax = *yp (t1) movl (%edx),%ebx # ebx = *xp (t0) movl %eax,(%edx) # *xp = eax movl %ebx,(%ecx) # *yp = ebx CS 3214 Fall 2011

Indexed Addressing Modes Most General Form D(Rb,Ri,S) Mem[Reg[Rb]+S*Reg[Ri]+ D] D: Constant “displacement” 1, 2, or 4 bytes Rb: Base register: Any of 8 integer registers Ri: Index register: Any, except for %esp Unlikely you’d use %ebp, either S: Scale: 1, 2, 4, or 8 Special Cases (Rb,Ri) Mem[Reg[Rb]+Reg[Ri]] D(Rb,Ri) Mem[Reg[Rb]+Reg[Ri]+D] (Rb,Ri,S) Mem[Reg[Rb]+S*Reg[Ri]] CS 3214 Fall 2011

Address Computation Examples %edx 0xf000 %ecx 0x100 Expression Computation Address 0x8(%edx) 0xf000 + 0x8 0xf008 (%edx,%ecx) 0xf000 + 0x100 0xf100 (%edx,%ecx,4) 0xf000 + 4*0x100 0xf400 0x80(,%edx,2) 2*0xf000 + 0x80 0x1e080 CS 3214 Fall 2011

x86-64 Integer Registers Extend existing registers. Add 8 new ones. %rax %eax %r8 %r8d %rbx %ebx %r9 %r9d %rcx %ecx %r10 %r10d %rdx %edx %r11 %r11d %rsi %esi %r12 %r12d %rdi %edi %r13 %r13d %rsp %esp %r14 %r14d %rbp %ebp %r15 %r15d Extend existing registers. Add 8 new ones. Make %ebp/%rbp general purpose

Instructions Long word l (4 Bytes) ↔ Quad word q (8 Bytes) New instructions: movl ➙ movq addl ➙ addq sall ➙ salq etc. 32-bit instructions that generate 32-bit results Set higher order bits of destination register to 0 Example: addl

64-bit code for swap swap: movl (%rdi), %edx movl (%rsi), %eax movl %eax, (%rdi) movl %edx, (%rsi) ret Set Up void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; } Body Finish Operands passed in registers (why useful?) First (xp) in %rdi, second (yp) in %rsi 64-bit pointers No stack operations required 32-bit data Data held in registers %eax and %edx movl operation

64-bit code for long int swap swap_l: movq (%rdi), %rdx movq (%rsi), %rax movq %rax, (%rdi) movq %rdx, (%rsi) ret Set Up void swap(long *xp, long *yp) { long t0 = *xp; long t1 = *yp; *xp = t1; *yp = t0; } Body Finish 64-bit data Data held in registers %rax and %rdx Notice use of movq Very RISCy

Address Computation Instruction leal Src,Dest Src is address mode expression Set Dest to address denoted by expression Uses Computing address without doing memory reference E.g., translation of p = &x[i]; Computing arithmetic expressions of the form x + k*y k = 1, 2, 4, or 8. Exception to 2-operand rule: ‘add’ instruction that can have three different operands! (though doesn’t set condition codes…) Avoid confusion: looks like a memory access with its parentheses ( ), but isn’t! CS 3214 Fall 2011

Arithmetic Operations (1) Format Computation Two Operand Instructions addl Src,Dest Dest = Dest + Src subl Src,Dest Dest = Dest - Src imull Src,Dest Dest = Dest * Src sall Src,Dest Dest = Dest << Src Also called shll sarl Src,Dest Dest = Dest >> Src Arithmetic shrl Src,Dest Dest = Dest >> Src Logical xorl Src,Dest Dest = Dest ^ Src andl Src,Dest Dest = Dest & Src orl Src,Dest Dest = Dest | Src CS 3214 Fall 2011

Arithmetic Operations (2) Format Computation One Operand Instructions incl Dest Dest = Dest + 1 decl Dest Dest = Dest - 1 negl Dest Dest = - Dest notl Dest Dest = ~ Dest CS 3214 Fall 2011

Using leal for Arithmetic Expressions pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax movl 12(%ebp),%edx leal (%edx,%eax),%ecx leal (%edx,%edx,2),%edx sall $4,%edx addl 16(%ebp),%ecx leal 4(%edx,%eax),%eax imull %ecx,%eax movl %ebp,%esp popl %ebp ret Set Up int arith (int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; } Body Finish CS 3214 Fall 2011

Understanding arith Stack int arith (int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; } y x Rtn adr Old %ebp %ebp 4 8 12 Offset Stack • z 16 movl 8(%ebp),%eax # eax = x movl 12(%ebp),%edx # edx = y leal (%edx,%eax),%ecx # ecx = x+y (t1) leal (%edx,%edx,2),%edx # edx = 3*y sall $4,%edx # edx = 48*y (t4) addl 16(%ebp),%ecx # ecx = z+t1 (t2) leal 4(%edx,%eax),%eax # eax = 4+t4+x (t5) imull %ecx,%eax # eax = t5*t2 (rval) CS 3214 Fall 2011

Understanding arith # eax = x movl 8(%ebp),%eax # edx = y movl 12(%ebp),%edx # ecx = x+y (t1) leal (%edx,%eax),%ecx # edx = 3*y leal (%edx,%edx,2),%edx # edx = 48*y (t4) sall $4,%edx # ecx = z+t1 (t2) addl 16(%ebp),%ecx # eax = 4+t4+x (t5) leal 4(%edx,%eax),%eax # eax = t5*t2 (rval) imull %ecx,%eax int arith (int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; } CS 3214 Fall 2011

Another Example logical: pushl %ebp Set movl %esp,%ebp movl 8(%ebp),%eax xorl 12(%ebp),%eax sarl $17,%eax andl $8185,%eax movl %ebp,%esp popl %ebp ret Set Up int logical(int x, int y) { int t1 = x^y; int t2 = t1 >> 17; int mask = (1<<13) - 7; int rval = t2 & mask; return rval; } Body Finish 213 = 8192, 213 – 7 = 8185 movl 8(%ebp),%eax eax = x xorl 12(%ebp),%eax eax = x^y (t1) sarl $17,%eax eax = t1>>17 (t2) andl $8185,%eax eax = t2 & 8185 CS 3214 Fall 2011

CISC Properties of x86 Instruction can reference different operand types Immediate, register, memory Arithmetic operations can read/write memory Memory reference can involve complex computation Rb + S*Ri + D Useful for arithmetic expressions, too Instructions can have varying lengths IA32 instructions can range from 1 to 15 bytes CS 3214 Fall 2011

Summary: Abstract Machines Machine Models Data Control C 1) char 2) int, float 3) double 4) struct, array 5) pointer 1) loops 2) conditionals 3) switch 4) Proc. call 5) Proc. return mem proc Assembly 1) byte 2) 2-byte word 3) 4-byte long word 4) contiguous byte allocation 5) address of initial byte 3) branch/jump 4) call 5) ret mem regs alu processor Stack Cond. Codes CS 3214 Fall 2011

Aside: Whose Assembler? Intel/Microsoft Format GAS/Gnu Format lea eax,[ecx+ecx*2] sub esp,8 cmp dword ptr [ebp-8],0 mov eax, dword ptr [eax*4+100h] leal (%ecx,%ecx,2),%eax subl $8,%esp cmpl $0,-8(%ebp) movl $0x100(,%eax,4),%eax Intel/Microsoft Differs from GAS Operands listed in opposite order mov Dest, Src movl Src, Dest Constants not preceded by ‘$’, Denote hex with ‘h’ at end 100h $0x100 Operand size indicated by operands rather than operator suffix sub subl Addressing format shows effective address computation [eax*4+100h] $0x100(,%eax,4) CS 3214 Fall 2011