x86 Programming I CSE 351 Autumn 2016

Slides:



Advertisements
Similar presentations
University of Washington Procedures and Stacks II The Hardware/Software Interface CSE351 Winter 2013.
Advertisements

Introduction to Machine/Assembler Language Noah Mendelsohn Tufts University Web:
Machine/Assembler Language Putting It All Together Noah Mendelsohn Tufts University Web:
1 Machine-Level Programming I: Basics Computer Systems Organization Andrew Case Slides adapted from Jinyang Li, Randy Bryant and Dave O’Hallaron.
64-Bit Architectures Topics 64-bit data New registers and instructions Calling conventions CS 105 “Tour of the Black Holes of Computing!”
Carnegie Mellon 1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Machine-Level Programming I: Basics Sep. 15, 2015.
INSTRUCTION SET AND ASSEMBLY LANGUAGE PROGRAMMING
Carnegie Mellon 1 Machine-Level Programming I: Basics Slides based on from those of Bryant and O’Hallaron.
1 Carnegie Mellon Assembly and Bomb Lab : Introduction to Computer Systems Recitation 4, Sept. 17, 2012.
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.
1 Machine-Level Programming II: Basics Comp 21000: Introduction to Computer Organization & Systems Spring 2016 Instructor: John Barr * Modified slides.
Microprocessors CSE- 341 Dr. Jia Uddin Assistant Professor, CSE, BRAC University Dr. Jia Uddin, CSE, BRAC University.
Microprocessors CSE- 341 Dr. Jia Uddin Assistant Professor, CSE, BRAC University Dr. Jia Uddin, CSE, BRAC University.
Spring 2016Assembly Review 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);
Today: Machine Programming I: Basics
Machine-Level Programming I: Basics
Samira Khan University of Virginia Feb 2, 2017
Instruction Set Architecture
Machine-Level Programming I: Basics
Assembly Programming I CSE 351 Spring 2017
Machine-Level Programming I:
Homework Reading Lab with your assigned section starts next week
Credits and Disclaimers
Assembly Programming II CSE 351 Spring 2017
IA32 Processors Evolutionary Design
Roadmap C: Java: Assembly language: OS: Machine code: Computer system:
Assembly Programming I CSE 410 Winter 2017
Roadmap C: Java: Assembly language: OS: Machine code: Computer system:
Machine-Level Programming I: Basics /18-213: Introduction to Computer Systems 5th Lecture, Jan. 28, 2016 Instructors: Seth Copen Goldstein & Franz.
Instructor: Phil Gibbons
The Stack & Procedures CSE 351 Spring 2017
Assembly Programming III CSE 410 Winter 2017
Homework Reading Continue work on mp1
Switch & Procedures & The Stack I CSE 351 Winter 2017
Machine-Level Programming 1 Introduction
x86-64 Programming III & The Stack CSE 351 Winter 2018
x86 Programming II CSE 351 Autumn 2016
Data III & Integers I CSE 351 Autumn 2016
Assembly Programming IV CSE 351 Spring 2017
x86-64 Programming III & The Stack CSE 351 Winter 2018
Roadmap C: Java: Assembly language: OS: Machine code: Computer system:
Procedures & The Stack I CSE 351 Autumn 2016
Lecture 5 Machine Programming
Carnegie Mellon Machine-Level Programming III: Procedures : Introduction to Computer Systems October 22, 2015 Instructor: Rabi Mahapatra Authors:
x86-64 Programming I CSE 351 Summer 2018
x86-64 Programming III & The Stack CSE 351 Autumn 2017
Assembly Programming II CSE 410 Winter 2017
x86-64 Programming I CSE 351 Autumn 2017
Authors: Randal E. Bryant and David R. O’Hallaron
The Stack & Procedures CSE 351 Winter 2018
Roadmap C: Java: Assembly language: OS: Machine code: Computer system:
x86-64 Programming I CSE 351 Winter 2018
x86-64 Programming II CSE 351 Summer 2018
Machine-Level Programming III: Arithmetic Comp 21000: Introduction to Computer Organization & Systems March 2017 Systems book chapter 3* * Modified slides.
x86-64 Programming I CSE 351 Winter 2018
Machine-Level Representation of Programs (x86-64)
x86-64 Programming I CSE 351 Autumn 2018
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 III: Arithmetic Comp 21000: Introduction to Computer Organization & Systems March 2017 Systems book chapter 3* * Modified slides.
Machine-Level Programming II: Basics Comp 21000: Introduction to Computer Organization & Systems Spring 2016 Instructor: John Barr * Modified slides.
CSC 497/583 Advanced Topics in Computer Security
x86-64 Programming II CSE 351 Winter 2019
The von Neumann Machine
Lecture 5 Machine Programming
Credits and Disclaimers
x86-64 Programming I CSE 351 Spring 2019
CS201- Lecture 7 IA32 Data Access and Operations Part II
Assembly Programming I CSE 351 Spring 2017
Presentation transcript:

x86 Programming I CSE 351 Autumn 2016 Instructor: Justin Hsia Teaching Assistants: Chris Ma Hunter Zahn John Kaltenbach Kevin Bi Sachin Mehta Suraj Bhat Thomas Neuman Waylon Huang Xi Liu Yufang Sun http://xkcd.com/409/

Administrivia Lab 1 due today at 5pm You have late days available Lab 2 (x86 assembly) released next Tuesday (10/18) Homework 1 due next Friday (10/21)

Roadmap C: Java: Assembly language: OS: Machine code: Computer system: Memory & data Integers & floats Machine code & C x86 assembly Procedures & stacks Arrays & structs Memory & caches Processes Virtual memory Memory allocation Java vs. C C: Java: 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); c.setGals(17); float mpg = c.getMPG(); Assembly language: get_mpg: pushq %rbp movq %rsp, %rbp ... popq %rbp ret OS: Machine code: 0111010000011000 100011010000010000000010 1000100111000010 110000011111101000011111 Computer system:

x86 Topics for Today Registers Move instructions and operands Arithmetic operations Memory addressing modes swap example

What is a Register? A location in the CPU that stores a small amount of data, which can be accessed very quickly (once every clock cycle) Registers have names, not addresses In assembly, they start with % (e.g., %rsi) Registers are at the heart of assembly programming They are a precious commodity in all architectures, but especially x86

x86-64 Integer Registers – 64 bits wide %rsp %esp %eax %rax %ebx %rbx %ecx %rcx %edx %rdx %esi %rsi %edi %rdi %ebp %rbp %r8d %r8 %r9d %r9 %r10d %r10 %r11d %r11 %r12d %r12 %r13d %r13 %r14d %r14 %r15d %r15 Can reference low-order 4 bytes (also low-order 2 & 1 bytes) Names are largely arbitrary, reasons behind them are not super relevant to us But there are conventions about how they are used One is particularly important to not misuse: %rsp Stack pointer; we’ll get to this when we talk about procedures Why is %rbp now general-purpose in x86-64? http://www.codemachine.com/article_x64deepdive.html r8-r15: still names not indexes Each is 8-bytes wide What if we only want 4 bytes? We can use these alternate names to use just half of the bytes

Some History: IA32 Registers – 32 bits wide %esi %si %edi %di %esp %sp %ebp %bp %eax %ax %ah %al %ecx %cx %ch %cl %edx %dx %dh %dl %ebx %bx %bh %bl 16-bit virtual registers (backwards compatibility) general purpose accumulate counter data base source index destination index stack pointer base pointer Only 6 registers that we can do whatever we want with Remember how I said we’ve been upgrading x86 since 1978, when it was 16-bit? Originally just %ax, … Could even reference single bytes (high, low) There used to be more conventions about how they were used Just to make it easier when people were writing assembly by hand Now irrelevant Name Origin (mostly obsolete)

x86-64 Assembly Data Types “Integer” data of 1, 2, 4, or 8 bytes Data values Addresses (untyped pointers) Floating point data of 4, 8, 10 or 2x8 or 4x4 or 8x2 Different registers for those (e.g. %xmm1, %ymm2) Come from extensions to x86 (SSE, AVX, …) Probably won’t have time to get into these  No aggregate types such as arrays or structures Just contiguously allocated bytes in memory Two common syntaxes “AT&T”: used by our course, slides, textbook, gnu tools, … “Intel”: used by Intel documentation, Intel tools, … Must know which you’re reading

Three Basic Kinds of Instructions Transfer data between memory and register Load data from memory into register %reg = Mem[address] Store register data into memory Mem[address] = %reg Perform arithmetic operation on register or memory data c = a + b; z = x << y; i = h & g; Control flow: what instruction to execute next Unconditional jumps to/from procedures Conditional branches Remember: Memory is indexed just like an array of bytes!

Operand types Immediate: Constant integer data %rax %rcx Examples: $0x400, $-533 Like C literal, but prefixed with ‘$’ Encoded with 1, 2, 4, or 8 bytes depending on the instruction Register: 1 of 16 integer registers Examples: %rax, %r13 But %rsp reserved for special use Others have special uses for particular instructions Memory: Consecutive bytes of memory at a computed address Simplest example: (%rax) Various other “address modes” %rax %rcx %rdx %rbx %rsi %rdi %rsp %rbp %rN

Moving Data General form: mov_ source, destination movb src, dst Missing letter (_) specifies size of operands Note that due to backwards-compatible support for 8086 programs (16-bit machines!), “word” means 16 bits = 2 bytes in x86 instruction names Lots of these in typical code movb src, dst Move 1-byte “byte” movw src, dst Move 2-byte “word” movl src, dst Move 4-byte “long word” movq src, dst Move 8-byte “quad word”

movq Operand Combinations Source Dest Src, Dest C Analog movq Imm Reg movq $0x4, %rax Mem movq $-147, (%rax) movq %rax, %rdx movq %rax, (%rdx) movq (%rax), %rdx var_a = 0x4; *p_a = -147; var_d = var_a; *p_d = var_a; var_d = *p_a; Cannot do memory-memory transfer with a single instruction How would you do it?

Memory vs. Registers Addresses vs. Names Big vs. Small Slow vs. Fast 0x7FFFD024C3DC %rdi Big vs. Small ~ 8 GiB (16 x 8 B) = 128 B Slow vs. Fast ~50-100 ns sub-nanosecond timescale Dynamic vs. Static Can “grow” as needed fixed number in hardware while program runs

Some Arithmetic Operations Binary (two-operand) Instructions: Beware argument order! No distinction between signed and unsigned Only arithmetic vs. logical shifts How do you implement “r3 = r1 + r2”? Maximum of one memory operand Format Computation addq src, dst dst = dst + src (dst += src) subq src, dst dst = dst – src imulq src, dst dst = dst * src signed mult sarq src, dst dst = dst >> src Arithmetic shrq src, dst Logical shlq src, dst dst = dst << src (same as salq) xorq src, dst dst = dst ^ src andq src, dst dst = dst & src orq src, dst dst = dst | src r3 = r1 + r2 mov r1, r3 add r2, r3 operand size specifier

Some Arithmetic Operations Unary (one-operand) Instructions: See CSPP Section 3.5.5 for more instructions: mulq, cqto, idivq, divq Format Computation incq dst dst = dst + 1 increment decq dst dst = dst – 1 decrement negq dst dst = –dst negate notq dst dst = ~dst bitwise complement Why have a different inc operator? Smaller bit representation! Maybe faster implementation

Arithmetic Example long simple_arith(long x, long y) { Register Use(s) %rdi 1st argument (x) %rsi 2nd argument (y) %rax return value long simple_arith(long x, long y) { long t1 = x + y; long t2 = t1 * 3; return t2; } y += x; y *= 3; long r = y; return r; simple_arith: addq %rdi, %rsi imulq $3, %rsi movq %rsi, %rax ret Function calling convention (get to it later) says which registers to use for arguments and return value Compiler knows Arithmetic ops are like “+=“ And it doesn’t need intermediate values anyway So it transforms it to... HW1 Now you’re all set! It’ll ask you to go backwards, from Assembly to C

Example of Basic Addressing Modes void swap(long *xp, long *yp) { long t0 = *xp; long t1 = *yp; *xp = t1; *yp = t0; } swap: movq (%rdi), %rax movq (%rsi), %rdx movq %rdx, (%rdi) movq %rax, (%rsi) ret

Understanding swap() Registers Memory void swap(long *xp, long *yp) { %rdi %rsi %rax %rdx Registers Memory void swap(long *xp, long *yp) { long t0 = *xp; long t1 = *yp; *xp = t1; *yp = t0; } swap: movq (%rdi), %rax movq (%rsi), %rdx movq %rdx, (%rdi) movq %rax, (%rsi) ret Register Variable %rdi ⇔ xp %rsi ⇔ yp %rax ⇔ t0 %rdx ⇔ t1

Understanding swap() Registers Memory swap: %rdi %rsi %rax %rdx 0x120 0x100 Registers Memory 123 456 0x120 0x118 0x110 0x108 0x100 Word Address swap: movq (%rdi), %rax # t0 = *xp movq (%rsi), %rdx # t1 = *yp movq %rdx, (%rdi) # *xp = t1 movq %rax, (%rsi) # *yp = t0 ret But actually, pointers are just addresses! Showing here 8-byte words of memory, addresses jump by 8

Understanding swap() Registers Memory swap: %rdi %rsi %rax %rdx 0x120 0x100 123 Registers Memory 123 456 0x120 0x118 0x110 0x108 0x100 Word Address swap: movq (%rdi), %rax # t0 = *xp movq (%rsi), %rdx # t1 = *yp movq %rdx, (%rdi) # *xp = t1 movq %rax, (%rsi) # *yp = t0 ret

Understanding swap() Registers Memory swap: %rdi %rsi %rax %rdx 0x120 0x100 123 456 Registers Memory 123 456 0x120 0x118 0x110 0x108 0x100 Word Address swap: movq (%rdi), %rax # t0 = *xp movq (%rsi), %rdx # t1 = *yp movq %rdx, (%rdi) # *xp = t1 movq %rax, (%rsi) # *yp = t0 ret

Understanding swap() Registers Memory swap: %rdi %rsi %rax %rdx 0x120 0x100 123 456 Registers Memory 123 456 0x120 0x118 0x110 0x108 0x100 Word Address swap: movq (%rdi), %rax # t0 = *xp movq (%rsi), %rdx # t1 = *yp movq %rdx, (%rdi) # *xp = t1 movq %rax, (%rsi) # *yp = t0 ret

Understanding swap() Registers Memory swap: %rdi %rsi %rax %rdx 0x120 0x100 123 456 Registers Memory 123 456 0x120 0x118 0x110 0x108 0x100 Word Address swap: movq (%rdi), %rax # t0 = *xp movq (%rsi), %rdx # t1 = *yp movq %rdx, (%rdi) # *xp = t1 movq %rax, (%rsi) # *yp = t0 ret

Memory Addressing Modes: Basic Indirect: (R) Mem[Reg[R]] Data in register R specifies the memory address Like pointer dereference in C Example: movq (%rcx), %rax Displacement: D(R) Mem[Reg[R]+D] Data in register R specifies the start of some memory region Constant displacement D specifies the offset from that address Example: movq 8(%rbp), %rdx

Complete Memory Addressing Modes General: D(Rb,Ri,S) Mem[Reg[Rb]+Reg[Ri]*S+D] Rb: Base register (any register) Ri: Index register (any register except %rsp) S: Scale factor (1, 2, 4, 8) – why these numbers? D: Constant displacement value (a.k.a. immediate) Special cases (see CSPP Figure 3.3 on p.181) D(Rb,Ri) Mem[Reg[Rb]+Reg[Ri]+D] (S=1) (Rb,Ri,S) Mem[Reg[Rb]+Reg[Ri]*S] (D=0) (Rb,Ri) Mem[Reg[Rb]+Reg[Ri]] (S=1,D=0) (,Ri,S) Mem[Reg[Ri]*S] (Rb=0,D=0) Syntax for memory operands can be more complex Designed to do things that are common with pointers D: displacement, add a constant Rb: base pointer Ri: index into array S: scale the index (pointer arithmetic needs to scale by the size of the pointer target) compiler keeps track of what the pointer points to and scales accordingly int x[] x[i] ith element of an array of ints: Ri=i, S=4 (bytes) See figure 3.3 in 3e textbook

Address Computation Examples %rdx %rcx 0xf000 0x0100 D(Rb,Ri,S) → Mem[Reg[Rb]+Reg[Ri]*S+D] Expression Address Computation Address 0x8(%rdx) (%rdx,%rcx) (%rdx,%rcx,4) 0x80(,%rdx,2)

Address Computation Examples %rdx %rcx 0xf000 0x0100 D(Rb,Ri,S) → Mem[Reg[Rb]+Reg[Ri]*S+D] Expression Address Computation Address 0x8(%rdx) 0xf000 + 0x8 0xf008 (%rdx,%rcx) 0xf000 + 0x100 0xf100 (%rdx,%rcx,4) 0xf000 + 0x100*4 0xf400 0x80(,%rdx,2) 0xf000*2 + 0x80 0x1e080

Peer Instruction Question Which of the following statements is TRUE? Vote at http://PollEv.com/justinh The program counter (%rip) is a register that we manually manipulate (A) There is only one way to compile a C program into assembly (B) Mem to Mem (src to dst) is the only disallowed operand combination (C) We can compute an address without using any registers (D)

Summary Registers are named locations in the CPU for holding and manipulating data x86-64 uses 16 64-bit wide registers Assembly instructions have rigid form Operands include immediates, registers, and data at specified memory locations Many instruction variants based on size of data Memory Addressing Modes: The addresses used for accessing memory in mov (and other) instructions can be computed in several different ways Base register, index register, scale factor, and displacement map well to pointer arithmetic operations