Machine Programming 1: Introduction

Similar documents
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

Assembly I: Basic Operations. Computer Systems Laboratory Sungkyunkwan University

CISC 360. Machine-Level Programming I: Introduction Sept. 18, 2008

Assembly I: Basic Operations. Jo, Heeseung

Machine-Level Programming I: Introduction Jan. 30, 2001

ASSEMBLY I: BASIC OPERATIONS. Jo, Heeseung

Assembly Programmer s View Lecture 4A Machine-Level Programming I: Introduction

Page # CISC 360. Machine-Level Programming I: Introduction Sept. 18, IA32 Processors. X86 Evolution: Programmerʼs View.

The Hardware/Software Interface CSE351 Spring 2015

The course that gives CMU its Zip! Machine-Level Programming I: Introduction Sept. 10, 2002

X86 Assembly -Data II:1

Machine-Level Programming Introduction

1 /* file cpuid2.s */ 4.asciz "The processor Vendor ID is %s \n" 5.section.bss. 6.lcomm buffer, section.text. 8.globl _start.

! Starting in 1978 with ! Added more features as time goes on. ! Still support old features, although obsolete

Assembly level Programming. 198:211 Computer Architecture. (recall) Von Neumann Architecture. Simplified hardware view. Lecture 10 Fall 2012

IA32 Processors The course that gives CMU its Zip! Machine-Level Programming I: Introduction Sept. 10, X86 Evolution: Programmer s View

Meet & Greet! Come hang out with your TAs and Fellow Students (& eat free insomnia cookies) When : TODAY!! 5-6 pm Where : 3rd Floor Atrium, CIT

CS241 Computer Organization Spring 2015 IA

Machine- level Programming

Giving credit where credit is due

Machine-Level Programming Introduction

Software. Hardware. x86 basics. ISA View. a brief history of x86 10/6/15. Program, Application. Programming Language. Compiler/Interpreter

CS241 Computer Organization Spring Addresses & Pointers

Sungkyunkwan University

Machine Programming 3: Procedures

Systems I. Machine-Level Programming I: Introduction

Process Layout and Function Calls

Questions about last homework? (Would more feedback be useful?) New reading assignment up: due next Monday

MACHINE-LEVEL PROGRAMMING I: BASICS COMPUTER ARCHITECTURE AND ORGANIZATION

Process Layout, Function Calls, and the Heap

Ge-ng at things on the chip you can t easily reach from C

Machine-Level Programming II: Control and Arithmetic

Carnegie Mellon. 5 th Lecture, Jan. 31, Instructors: Todd C. Mowry & Anthony Rowe

Today: Machine Programming I: Basics

Machine-Level Programming II: Arithmetic & Control /18-243: Introduction to Computer Systems 6th Lecture, 5 June 2012

Instruction Set Architectures

Computer Systems Architecture I. CSE 560M Lecture 3 Prof. Patrick Crowley

Credits to Randy Bryant & Dave O Hallaron

CS429: Computer Organization and Architecture

Machine-Level Programming II: Arithmetic & Control. Complete Memory Addressing Modes

Machine Level Programming I: Basics

Machine Level Programming I: Basics. Credits to Randy Bryant & Dave O Hallaron

Instruction Set Architectures

Machine Level Programming II: Arithmetic &Control

MACHINE-LEVEL PROGRAMMING I: BASICS

Machine-Level Programming I Introduction

CAS CS Computer Systems Spring 2015 Solutions to Problem Set #2 (Intel Instructions) Due: Friday, March 20, 1:00 pm

CS213. Machine-Level Programming III: Procedures

Machine-Level Programming I Introduction

Machine-Level Programming I: Introduction

Machine Programming I: Basics

Handout #2: Machine-Level Programs

Last Time: Floating Point. Intel x86 Processors. Lecture 4: Machine Basics Computer Architecture and Systems Programming ( )

Assembly III: Procedures. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

ASSEMBLY III: PROCEDURES. Jo, Heeseung

Assembly III: Procedures. Jo, Heeseung

+ Machine Level Programming: x86-64 History

Homework. In-line Assembly Code Machine Language Program Efficiency Tricks Reading PAL, pp 3-6, Practice Exam 1

CMSC 313 Fall2009 Midterm Exam 2 Section 01 Nov 11, 2009

Machine-level Programming (3)

Machine- Level Programming: Basics

The course that gives CMU its Zip! Machine-Level Programming III: Procedures Sept. 17, 2002

Instruction Set Architecture

Instruction Set Architecture

Credits and Disclaimers

CS , Fall 2001 Exam 1

CS165 Computer Security. Understanding low-level program execution Oct 1 st, 2015

Machine-Level Programming III: Procedures

Machine-level Representation of Programs. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

Today: Machine Programming I: Basics. Machine Level Programming I: Basics. Intel x86 Processors. Intel x86 Evolution: Milestones

Y86 Processor State. Instruction Example. Encoding Registers. Lecture 7A. Computer Architecture I Instruction Set Architecture Assembly Language View

Sungkyunkwan University

An Experience Like No Other. Stack Discipline Aug. 30, 2006

Region of memory managed with stack discipline Grows toward lower addresses. Register %esp contains lowest stack address = address of top element

4) C = 96 * B 5) 1 and 3 only 6) 2 and 4 only

X86 Assembly -Procedure II:1

CS 31: Intro to Systems ISAs and Assembly. Martin Gagné Swarthmore College February 7, 2017

CISC 360 Instruction Set Architecture

CSE2421 FINAL EXAM SPRING Name KEY. Instructions: Signature

CS 31: Intro to Systems ISAs and Assembly. Kevin Webb Swarthmore College February 9, 2016

Instruction Set Architecture

CS 31: Intro to Systems ISAs and Assembly. Kevin Webb Swarthmore College September 25, 2018

Chapter 3 Machine-Level Programming II Control Flow

CS241 Computer Organization Spring Loops & Arrays

administrivia today start assembly probably won t finish all these slides Assignment 4 due tomorrow any questions?

Machine Language, Assemblers and Linkers"

Assembly I: Basic Operations. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

The Hardware/Software Interface CSE351 Spring 2013

Stack Discipline Jan. 19, 2018

Procedure Calls. Young W. Lim Sat. Young W. Lim Procedure Calls Sat 1 / 27

Instructor: Alvin R. Lebeck

Machine- Level Programming II: Arithme c & Control

Binghamton University. CS-220 Spring X86 Debug. Computer Systems Section 3.11

X86 Addressing Modes Chapter 3" Review: Instructions to Recognize"

IA32 Stack. Stack BoDom. Region of memory managed with stack discipline Grows toward lower addresses. Register %esp contains lowest stack address

hnp://

Representation of Information

Three Kinds of Instruc;ons

CMSC 313 Lecture 12. Project 3 Questions. How C functions pass parameters. UMBC, CMSC313, Richard Chang

The Hardware/Software Interface CSE351 Spring 2015

Transcription:

Machine Programming 1: Introduction CS61, Lecture 3 Prof. Stephen Chong September 8, 2011

Announcements (1/2) Assignment 1 due Tuesday Please fill in survey by 5pm today! Assignment 2 will be released tonight More information on website this evening Office hours will start next week See course website for office hours Both Announcements, and Course Staff pages. More course staff coming on board soon, more office hours Name tags At back of room Fill in, put in front of you, leave at end of class in appropriate box 2

Announcements (2/2) Sections will start next week Times: Mondays 10:00-11:30am Mondays 2:30-4:00pm Mondays 4:00-5:30pm Tuesdays 10:00-11:30am Tuesdays 7:00-8:30pm (Quad) College students: please complete sectioning tool by Friday 5pm Go to https://www.section.fas.harvard.edu/ (Extension School students: Rob will be in touch to schedule your section.) More info about sections on course website. 3

Topics for today C, assembly, machine code C to machine code Disassembly Assembly basics Operands Moving data Arrays LEAL: Load Effective Address Data operations Data types x86-64 4

Highscore -bash-3.2$ ~stephenchong/highscore Usage: /home/s/t/stephenchong/highscore i j k l where i,j,k,l are integers. Try to get as high a score as you can. Note: any positive score will send an email to Prof. Chong. 35 people tried it out 5 people hacked the score without supplying right inputs Including one score of Infinity 9 got a score of 61! Requires disassembly of four functions 9 got more (waaaaaay more) than 61 Requires understanding integer overflow! 5

Turning C into machine code C program (myprog.c) int dosum(int i, int j) { return i+j; } C compiler (gcc) Assembly program (myprog.s) dosum: pushl movl movl addl popl ret %ebp %esp, %ebp 12(%ebp), %eax 8(%ebp), %eax %ebp Assembler (gas) Machine code (myprog.o) 80483b0: 55 89 e5 8b 45 0c 03 45 08 5d c3 6

Skipping assembly language Most C compilers generate machine code (object files) directly. That is, without actually generating the human-readable assembly file. Assembly language is mostly useful to people, not machines. myprog.c gcc -S myprog.s gas myprog.o gcc -c Can generate assembly from C using gcc -S And then compile to an object file by hand using gas 7

Object files and executables C source file (myprog.c) is compiled into an object file (myprog.o) Object file contains the machine code for that C file. It may contain references to external variables and routines E.g., if myprog.c calls printf(), then myprog.o will contain a reference to printf(). Multiple object files are linked to produce an executable file. Typically, standard libraries (e.g., libc ) are included in the linking process. Libraries are just collections of pre-compiled object files, nothing more! myprog.c somelib.c gcc -c gcc -c myprog.o somelib.o linker (ld) myprog 8

Characteristics of assembly language Assembly language is very, very simple. Simple, minimal data types Integer data of 1, 2, 4, or 8 bytes Floating point data of 4, 8, or 10 bytes No aggregate types such as arrays or structures! Primitive operations Perform arithmetic operation on registers or memory (add, subtract, etc.) Read data from memory into a register Store data from register into memory Transfer control of program (jump to new address) Test a control flag, conditional jump (e.g., jump only if zero flag set) More complex operations must be built up as (possibly long) sequences of instructions. 9

Why you need to understand assembly language These days, very few people write assembly code Very very few people write significant amounts of assembly code! You won t need to write assembly in this course, and probably won t in future But, you will need to be able to read it to understand what a program is really doing, and how the processor works. Examples: Understanding strange memory bugs (stack smashing, core dumps, etc.) Understanding what affects the performance of a given piece of code Understanding what the heck the compiler is doing to your precious C program Other uses... Writing device drivers: Sometimes need to drop down to assembler Writing an OS or embedded system Writing a compiler 10

Disassembling Assembly is a human readable form of machine code Assemblers (e.g., gas) compile assembly to machine code Disassemblers convert machine code to assembly Interprets bits as instructions Useful tools for examining machine code 11

Disassemblers objdump objdump -d myprog.o Can be used on object files (.o) or complete executables gdb GNU debugger Can disassemble, run, set breakpoints, examine memory and registers Course website contains links to some resources for learning gdb Play around with both! gdb will be especially helpful in assignments 12

What can be disassembled? Anything that can be interpreted as executable code Disassembler simply examines bits, interprets them as machine code, and reconstructs assembly % objdump -d WINWORD.EXE WINWORD.EXE: file format pei-i386 No symbols in "WINWORD.EXE". Disassembly of section.text: 30001000 <.text>: 30001000: 55 push %ebp 30001001: 8b ec mov %esp,%ebp 30001003: 6a ff push $0xffffffff 30001005: 68 90 10 00 30 push $0x30001090 3000100a: 68 91 dc 4c 30 push $0x304cdc91 13

Topics for today C, assembly, machine code C to machine code Disassembly Assembly basics Operands Moving data Arrays LEAL: Load Effective Address Data operations Data types x86-64 14

Addressing modes Most instructions have one or more operands Specify input and output for operations Inputs can be registers, memory locations, or immediate (constant) values Outputs can be saved to registers or memory locations Collectively, these ways of accessing operands are called addressing modes Different instructions support different addressing modes Need to check the manual to find out which modes are allowed Example: movl instruction (copy 32-bit value) supports... Immediate to register Register to register Memory to register (a.k.a. load ) Register to memory (a.k.a. store ) Cannot move from memory to memory! movl $0x1000, %eax movl %eax, %ebx movl (%eax), %ebx movl %eax, (%ebx) 15

Immediate and register operands Immediate operands are for constant values Written with a $ followed by integer in standard C notation E.g., $-577, $0x1F Operand value is simply the immediate value Register operands denote content of register Written as the name of the register, which starts with a % sign E.g., %eax, %ebx Operand value is R[E a ] where E a denotes a register, R[E a ] denotes value stored in register 16

Memory operands Most general form is Imm(E b, E i, s) Imm is immediate offset, E b is base register, E i is index register, s is scale (must be 1, 2, 4 or 8) Effective address is Imm + R[E b ] + R[E i ] s Operand value is M[ Imm + R[E b ] + R[E i ] s ] Other forms special cases of this general form Imm is an immediate, or absolute, address e.g., 0x1a38 (E b ) is an indirect address e.g., (%eax) is contents of register %eax Imm(E b ) is a base address plus a displacement e.g., 0x8(%ebp) is contents of register %ebp plus 8 (E b, E i ) and Imm(E b, E i ) are indexed addresses 17

Address computation example %edx %ecx 0xf000 0x100 Expression Computation Address 0x8(%edx) (%edx, %ecx) (%edx, %ecx, 4) 0x80(, %edx, 2) 18

Address computation example %edx %ecx 0xf000 0x100 Expression Computation Address 0x8(%edx) 0xf000 + 0x8 0xf008 (%edx, %ecx) (%edx, %ecx, 4) 0x80(, %edx, 2) 19

Address computation example %edx %ecx 0xf000 0x100 Expression Computation Address 0x8(%edx) 0xf000 + 0x8 0xf008 (%edx, %ecx) 0xf000 + 0x100 0xf100 (%edx, %ecx, 4) 0x80(, %edx, 2) 20

Address computation example %edx %ecx 0xf000 0x100 Expression Computation Address 0x8(%edx) 0xf000 + 0x8 0xf008 (%edx, %ecx) 0xf000 + 0x100 0xf100 (%edx, %ecx, 4) 0xf000 + 4*0x100 0xf400 0x80(, %edx, 2) 21

Address computation example %edx %ecx 0xf000 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 22

Moving data Copy data from one location to another Heavily used! movx source, dest x is one of b, w, l movb source, dest Move 1-byte byte movw source, dest Move 2-byte word (for historical reasons) movl source, dest Move 4-byte long word (for historical reasons) 23

AT&T vs Intel syntax Two common ways of formatting IA32 assembly AT&T We use this in class, used by gcc, gdb, objdump Intel Used by Intel documentation, Microsoft tools Differences: Intel omits size designation: mov instead of movl Intel omits % from register names: ebp instead of %ebp Intel describes memory locations differently: [ebp+8] instead of 8(%ebp) Intel lists operands in reverse order: mov dest, src instead of movl src, dest 24

movl examples Instruction Src Dest C analog movl $0x4,%eax movl $-147,(%eax) movl %eax,%edx movl %eax,(%edx) movl (%eax),%edx 25

movl examples Instruction Src Dest C analog movl $0x4,%eax Imm Reg temp = 0x4; movl $-147,(%eax) movl %eax,%edx movl %eax,(%edx) movl (%eax),%edx 26

movl examples Instruction Src Dest C analog movl $0x4,%eax Imm Reg temp = 0x4; movl $-147,(%eax) Imm Mem *p = -147; movl %eax,%edx movl %eax,(%edx) movl (%eax),%edx 27

movl examples Instruction Src Dest C analog movl $0x4,%eax Imm Reg temp = 0x4; movl $-147,(%eax) Imm Mem *p = -147; movl %eax,%edx Reg Reg temp2 = temp1; movl %eax,(%edx) movl (%eax),%edx 28

movl examples Instruction Src Dest C analog movl $0x4,%eax Imm Reg temp = 0x4; movl $-147,(%eax) Imm Mem *p = -147; movl %eax,%edx Reg Reg temp2 = temp1; movl %eax,(%edx) Reg Mem *p = temp; movl (%eax),%edx 29

movl examples Instruction Src Dest C analog movl $0x4,%eax Imm Reg temp = 0x4; movl $-147,(%eax) Imm Mem *p = -147; movl %eax,%edx Reg Reg temp2 = temp1; movl %eax,(%edx) Reg Mem *p = temp; movl (%eax),%edx Mem Reg temp = *p; Note: Cannot move directly from memory to memory with single instruction! Note: C pointers are just memory addresses 30

Example: swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t0; *yp = t1; } swap: pushl %ebp pushl %ebx movl %esp,%ebp movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx),%eax movl (%edx),%ebx movl %eax,(%edx) movl %ebx,(%ecx) Set up Body movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret Finish 31

Example: swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t0; *yp = t1; } swap: pushl %ebp pushl %ebx movl %esp,%ebp movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx),%eax movl (%edx),%ebx movl %eax,(%edx) movl %ebx,(%ecx) Set up Body movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret Finish 32

Understanding swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t0; *yp = t1; } movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx),%eax movl (%edx),%ebx movl %eax,(%edx) movl %ebx,(%ecx) Body 33

Understanding swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t0; *yp = t1; } %ebp Offset 12 8 4 0-4 Stack yp xp Return address Old %ebp Old %ebx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx),%eax movl (%edx),%ebx movl %eax,(%edx) movl %ebx,(%ecx) Body 34

Understanding swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t0; *yp = t1; } %ebp Offset 12 8 4 0-4 Stack yp xp Return address Old %ebp Old %ebx %ecx %edx %eax %ebx yp xp t1 t0 movl 12(%ebp),%ecx # %ecx = yp movl 8(%ebp),%edx # %edx = xp movl (%ecx),%eax # %eax = *yp movl (%edx),%ebx # %ebx = *xp movl %eax,(%edx) # *xp = %eax movl %ebx,(%ecx) # *yp = %ebx Body 35

Understanding swap %eax Stack 123 456 Address 0x120 0x11c %ecx 0x11c Offset 0x118 0x114 %edx %ebx %esi %ebp 12 8 4 0-4 0x11c 0x120 Return address Old %ebp Old %ebx 0x110 0x10c 0x108 0x104 0x100 %edi %esp %ebp 0x104 movl 12(%ebp),%ecx # %ecx = yp movl 8(%ebp),%edx # %edx = xp movl (%ecx),%eax # %eax = *yp movl (%edx),%ebx # %ebx = *xp movl %eax,(%edx) # *xp = %eax movl %ebx,(%ecx) # *yp = %ebx Body 36

Understanding swap %eax Stack 123 456 Address 0x120 0x11c %ecx 0x11c Offset 0x118 0x114 %edx %ebx %esi 0x120 %ebp 12 8 4 0-4 0x11c 0x120 Return address Old %ebp Old %ebx 0x110 0x10c 0x108 0x104 0x100 %edi %esp %ebp 0x104 movl 12(%ebp),%ecx # %ecx = yp movl 8(%ebp),%edx # %edx = xp movl (%ecx),%eax # %eax = *yp movl (%edx),%ebx # %ebx = *xp movl %eax,(%edx) # *xp = %eax movl %ebx,(%ecx) # *yp = %ebx Body 37

Understanding swap %eax 456 Stack 123 456 Address 0x120 0x11c %ecx 0x11c Offset 0x118 0x114 %edx %ebx %esi 0x120 %ebp 12 8 4 0-4 0x11c 0x120 Return address Old %ebp Old %ebx 0x110 0x10c 0x108 0x104 0x100 %edi %esp %ebp 0x104 movl 12(%ebp),%ecx # %ecx = yp movl 8(%ebp),%edx # %edx = xp movl (%ecx),%eax # %eax = *yp movl (%edx),%ebx # %ebx = *xp movl %eax,(%edx) # *xp = %eax movl %ebx,(%ecx) # *yp = %ebx Body 38

Understanding swap %eax 456 Stack 123 456 Address 0x120 0x11c %ecx 0x11c Offset 0x118 0x114 %edx %ebx %esi 0x120 123 %ebp 12 8 4 0-4 0x11c 0x120 Return address Old %ebp Old %ebx 0x110 0x10c 0x108 0x104 0x100 %edi %esp %ebp 0x104 movl 12(%ebp),%ecx # %ecx = yp movl 8(%ebp),%edx # %edx = xp movl (%ecx),%eax # %eax = *yp movl (%edx),%ebx # %ebx = *xp movl %eax,(%edx) # *xp = %eax movl %ebx,(%ecx) # *yp = %ebx Body 39

Understanding swap %eax 456 Stack 456 456 Address 0x120 0x11c %ecx 0x11c Offset 0x118 0x114 %edx %ebx %esi 0x120 123 %ebp 12 8 4 0-4 0x11c 0x120 Return address Old %ebp Old %ebx 0x110 0x10c 0x108 0x104 0x100 %edi %esp %ebp 0x104 movl 12(%ebp),%ecx # %ecx = yp movl 8(%ebp),%edx # %edx = xp movl (%ecx),%eax # %eax = *yp movl (%edx),%ebx # %ebx = *xp movl %eax,(%edx) # *xp = %eax movl %ebx,(%ecx) # *yp = %ebx Body 40

Understanding swap %eax 456 Stack 456 123 Address 0x120 0x11c %ecx 0x11c Offset 0x118 0x114 %edx %ebx %esi 0x120 123 %ebp 12 8 4 0-4 0x11c 0x120 Return address Old %ebp Old %ebx 0x110 0x10c 0x108 0x104 0x100 %edi %esp %ebp 0x104 movl 12(%ebp),%ecx # %ecx = yp movl 8(%ebp),%edx # %edx = xp movl (%ecx),%eax # %eax = *yp movl (%edx),%ebx # %ebx = *xp movl %eax,(%edx) # *xp = %eax movl %ebx,(%ecx) # *yp = %ebx Body 41

Topics for today C, assembly, machine code C to machine code Disassembly Assembly basics Operands Moving data Arrays LEAL: Load Effective Address Data operations Data types x86-64 42

Arrays int a[10] declares an array of 10 integers in C a[0] is the first element of the array, a[9] is the 10th. But can use other indices than 0..9! E.g., void foo(int a[10]) { a[-1] = a[20] = 0x42; // Not good!! } Also, arrays and pointers are very closely related E.g., What s going on? void bar(int a[10]) { int *p = a; int i; for (i = 0; i < 10; i++) *(p++) = 0; } 43

Arrays An array is a contiguous region of memory int a[4]; a[0] = 0x11; a[1] = 0x22; a[2] = 0x33; 0x4690 Can be thought of as a pointer to the first element of the array Why do we add 4 to %eax each time? 0x4694 0x4698 0x469c 0x11 0x22 0x33...... a[0] a[1] a[2] a[3] movl $0x4690, %eax ; Set %eax to address of 'a' movl $0x11, (%eax) ; a[0] = 0x11 movl $0x22, 4(%eax) ; a[1] = 0x22 movl $0x33, 8(%eax) ; a[2] = 0x33 Each integer is represented with 4 bytes, so the address of a[1] and a[2] differ by 4 44

Arrays void foo(int a[10]) { a[-1] = 0x42; // Not good!! a[20] = 0xbeef; // Not good!! } movl 0x8(%ebp),%eax ; 0x8(%ebp) contains the pointer to array a subl $0x4,%eax ; a[-1] movl $0x42,(%eax) ; a[-1] = 0x42 movl 0x8(%ebp),%eax addl $0x50,%eax ; a[20] movl $0xbeef,(%eax) ; a[20] = 0xbeef void bar(int a[10]) { int *p = a; *(p+3) = 0xcafe; } movl 0x8(%ebp),%eax ; 0x8(%ebp) contains the pointer to array a addl $0xc,%eax ; p+3 movl $0xcafe,(%eax) ; *(p+3) = 0xcafe. Same as a[3] = 0xcafe 45

Address computation instruction leal src, dest src is address mode expression e.g., (%eax) or 0x8(%ebp) Most generally, Imm(base, index, scale) Set dest to the address denoted by expression src Load effective address Can compute an address without a memory reference E.g., compilation of C code p = &x[i] leal (%eax, %ebx, 4), %edx Can also be used to compute arithmetic expressions! Anything of the form x + y*k, where k = 1, 2, 4, or 8 46

Some arithmetic operations Two operand instructions Format Equivalent C computation 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 No distinction between signed and unsigned int. Why? 47

Shifting There is only one left-shift operator sal and shl are synonyms Shift bits left, filling from the right with zeros E.g., 0x1 << 3 = 1 2 3 = 0x8 Two different right-shift operators: sar and shr Both correspond to C operator >> What s the difference? 48

Shifting shr (logical right-shift) fills from left with zeros sar (arithmetic right-shift) files from left with sign bit of operand A form of sign extension C compiler figures out which to use based on type of operand Unsigned int uses logical right shift; signed int uses arithmetic right shift 2147483648 (80000000) 1073741824 (40000000) -2147483648 (80000000) -1073741824 (c0000000) #define print_unsigned(i) printf("%u (%x)\n",(i),(i)) #define print_signed(i) printf("%d (%x)\n",(i),(i)) int main() { int s = 0x80000000; unsigned int u = 0x80000000; print_unsigned(u); print_unsigned(u >> 1); // Uses shrl print_signed(s); } print_signed(s >> 1); return 1; // Uses sarl 49

Some more arithmetic operations One operand instructions Format Equivalent C computation incl Dest Dest = Dest + 1 decl Dest Dest = Dest - 1 negl Dest Dest = -Dest notl Dest Dest = ~Dest See textbook for more instructions 50

Example: logical 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; } logical: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax xorl 12(%ebp),%eax sarl $17,%eax andl $8185,%eax Set up Body movl %ebp,%esp popl %ebp ret Finish 51

Example: logical 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; } logical: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax xorl 12(%ebp),%eax sarl $17,%eax andl $8185,%eax Set up Body movl %ebp,%esp popl %ebp ret Finish 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 1<<13 = 2 13 = 8192 8192-7 = 8185 52