Presentation is loading. Please wait.

Presentation is loading. Please wait.

CS 3214 Computer Systems Lecture 2 Godmar Back.

Similar presentations


Presentation on theme: "CS 3214 Computer Systems Lecture 2 Godmar Back."— Presentation transcript:

1 CS 3214 Computer Systems Lecture 2 Godmar Back

2 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 to me if it doesn’t work CS 3214 Fall 2011

3 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 Part 1 Programs and Data CS 3214 Fall 2011

4 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

5 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

6 Intel x86 Processors, contd.
Machine Evolution M Pentium M Pentium/MMX M PentiumPro M Pentium III M Pentium M Core 2 Duo M Core i M 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 ) support 64-bit x86-64 CS 3214 Fall 2011

7 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 M Big performance boost Itanium 2 Dual-Core B Itanium has not taken off in marketplace Lack of backward compatibility, no good compiler support, Pentium 4 got too good CS 3214 Fall 2011

8 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

9 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

10 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

11 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

12 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

13 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

14 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

15 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 0x <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

16 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: CS 3214 Fall 2011

17 Disassembling Object Code
<sum>: 0: push %ebp 1: 89 e mov %esp,%ebp 3: 8b 45 0c mov 0xc(%ebp),%eax 6: add 0x8(%ebp),%eax 9: 89 ec mov %ebp,%esp b: 5d pop %ebp c: c ret d: 8d 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

18 Alternate Disassembly
Disassembled Object 0x <sum>: push %ebp 0x <sum+1>: mov %esp,%ebp 0x <sum+3>: mov 0xc(%ebp),%eax 0x <sum+6>: add 0x8(%ebp),%eax 0x <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

19 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)

20 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)

21 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

22 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

23 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

24 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

25 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

26 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

27 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

28 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

29 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

30 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

31 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

32 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

33 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

34 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

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

36 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

37 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

38 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

39 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

40 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

41 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

42 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

43 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

44 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

45 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

46 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

47 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

48 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

49 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


Download ppt "CS 3214 Computer Systems Lecture 2 Godmar Back."

Similar presentations


Ads by Google