Princeton University Computer Science 217: Introduction to Programming Systems. Assembly Language: Part 2

Similar documents
Assembly Language: Part 2

Princeton University. Computer Science 217: Introduction to Programming Systems. Assembly Language: Part 1

Princeton University Computer Science 217: Introduction to Programming Systems. Context of this Lecture. Assembly Language: Part 1

Assembly Language: IA-32 Instructions

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

Princeton University Computer Science 217: Introduction to Programming Systems. Assembly Language: Part 1

Process Layout and Function Calls

Assembly Language II: Addressing Modes & Control Flow

Von Neumann Architecture. Machine Languages. Context of this Lecture. High-Level Languages. Assembly Language: Part 1. Princeton University.

Credits and Disclaimers

last time Assembly part 2 / C part 1 condition codes reminder: quiz

Credits and Disclaimers

CSC 2400: Computer Systems. Towards the Hardware: Machine-Level Representation of Programs

CSC 8400: Computer Systems. Machine-Level Representation of Programs

Review addressing modes

Machine Level Programming: Control

The Hardware/Software Interface CSE351 Spring 2013

Assembly II: Control Flow. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

Assembly Language: Overview!

x86 Programming II CSE 351 Winter

Second Part of the Course

Credits and Disclaimers

CS61 Section Solutions 3

Assembly II: Control Flow

CSE351 Spring 2018, Midterm Exam April 27, 2018

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

Intel x86-64 and Y86-64 Instruction Set Architecture

Areas for growth: I love feedback

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

Basic Assembly Instructions

x86-64 Programming II

CS429: Computer Organization and Architecture

Process Layout, Function Calls, and the Heap

Machine-Level Programming II: Control and Arithmetic

L09: Assembly Programming III. Assembly Programming III. CSE 351 Spring Guest Lecturer: Justin Hsia. Instructor: Ruth Anderson

Assembly Language: Overview

Machine-Level Programming II: Control

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2017 Lecture 12

Control flow (1) Condition codes Conditional and unconditional jumps Loops Conditional moves Switch statements

Machine-Level Programming II: Control

Sistemi Operativi. Lez. 16 Elementi del linguaggio Assembler AT&T

Sungkyunkwan University

Assembly Programming III

Intel x86 Jump Instructions. Part 5. JMP address. Operations: Program Flow Control. Operations: Program Flow Control.

Intel x86 Jump Instructions. Part 5. JMP address. Operations: Program Flow Control. Operations: Program Flow Control.

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2016 Lecture 12

ASSEMBLY II: CONTROL FLOW. Jo, Heeseung

Machine-Level Programming (2)

CSE2421 FINAL EXAM SPRING Name KEY. Instructions: Signature

Intel Instruction Set (gas)

x86 64 Programming II

Assembly II: Control Flow. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

Credits to Randy Bryant & Dave O Hallaron

CS367. Program Control

CS 261 Fall Mike Lam, Professor. x86-64 Control Flow

System Programming and Computer Architecture (Fall 2009)

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

Computer Systems C S Cynthia Lee

Machine Language CS 3330 Samira Khan

mith College Computer Science CSC231 Assembly Week #9 Spring 2017 Dominique Thiébaut

CSC 252: Computer Organization Spring 2018: Lecture 6

CSCI 2021: x86-64 Control Flow

Branching and Looping

Control. Young W. Lim Mon. Young W. Lim Control Mon 1 / 16

Machine Level Programming II: Arithmetic &Control

Machine Programming 2: Control flow

CPS104 Recitation: Assembly Programming

CS356 Unit 5. Translation to Assembly. Translating HLL to Assembly ASSEMBLY TRANSLATION EXAMPLE. x86 Control Flow

Princeton University Computer Science 217: Introduction to Programming Systems. Agenda. Assembly Language: Part 2. Flattened C Code.

Ex: Write a piece of code that transfers a block of 256 bytes stored at locations starting at 34000H to locations starting at 36000H. Ans.

Lecture 3 CIS 341: COMPILERS

CS 3330 Exam 1 Fall 2017 Computing ID:

Instruction-set Design Issues: what is the ML instruction format(s) ML instruction Opcode Dest. Operand Source Operand 1...

CS 261 Fall Mike Lam, Professor. x86-64 Control Flow

Practical Malware Analysis

x86-64 Programming III & The Stack

CSE 351 Midterm Exam Spring 2016 May 2, 2015

Data Representa/ons: IA32 + x86-64

x86 Programming III CSE 351 Autumn 2016 Instructor: Justin Hsia

Do not turn the page until 5:10.

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

Flattened C Code. Agenda. Flattened C Code. Agenda. Assembly Language: Part 2. Princeton University. Flattened C Code

Where We Are. Optimizations. Assembly code. generation. Lexical, Syntax, and Semantic Analysis IR Generation. Low-level IR code.

2/12/2016. Today. Machine-Level Programming II: Control. Condition Codes (Implicit Setting) Processor State (x86-64, Partial)

Chapter 3 Machine-Level Programming II Control Flow

Assembly Programming IV

How Software Executes

Towards the Hardware"

CNIT 127: Exploit Development. Ch 1: Before you begin. Updated

Instruction-set Design Issues: what is the ML instruction format(s) ML instruction Opcode Dest. Operand Source Operand 1...

CS 33. Machine Programming (2) CS33 Intro to Computer Systems XII 1 Copyright 2017 Thomas W. Doeppner. All rights reserved.

Machine- Level Representa2on: Procedure

Control flow. Condition codes Conditional and unconditional jumps Loops Switch statements

Introduction to 8086 Assembly

CS 2505 Computer Organization I Test 2. Do not start the test until instructed to do so! printed

Lecture 8: Control Structures. Comparing Values. Flags Set by CMP. Example. What can we compare? CMP Examples

CSE 351 Midterm Exam

Basic Data Types. CS429: Computer Organization and Architecture. Array Allocation. Array Access

BAHAR DÖNEMİ MİKROİŞLEMCİLER LAB4 FÖYÜ

Instructor: Alvin R. Lebeck

Transcription:

Princeton University Computer Science 217: Introduction to Programming Systems Assembly Language: Part 2 1

Agenda Flattened C code Control flow with signed integers Control flow with unsigned integers Assembly Language: Defining global data Arrays Structures 2

Flattened C Code Problem Translating from C to assembly language is difficult when the C code contains nested statements Solution Flatten the C code to eliminate all nesting 3

Flattened C Code C if (expr) { statement1; statementn; } if (expr) { statementt1; statementtn; } else { statementf1; statementfn; } Flattened C if (! expr) goto endif1; statement1; statementn; endif1: if (! expr) goto else1; statement1; statementn; goto endif1; else1: statementf1; statementfn; endif1: 4

Flattened C Code C while (expr) { statement1; } statementn; for (expr1; expr2; expr3} { statement1; } statementn; See Bryant & O Hallaron book for faster patterns Flattened C loop1: if (! expr) goto endloop1; statement1; statementn; goto loop1; endloop1: expr1; loop1: if (! expr2) goto endloop1; statement1; statementn; expr3; goto loop1; endloop1: 5

Agenda Flattened C code Control flow with signed integers Control flow with unsigned integers Assembly Language: Defining global data Arrays Structures 6

if Example C int i; if (i < 0) i = -i; Flattened C int i; if (i >= 0) goto endif1; i = -i; endif1: 7

if Example Flattened C int i; if (i >= 0) goto endif1; i = -i; endif1: Assem Lang.section ".bss" i:.skip 4.section ".text" cmpl $0, i jge endif1 negl i endif1: Note: cmp instruction (counterintuitive operand order) Sets CC bits in EFLAGS register jge instruction (conditional jump) Examines CC bits in EFLAGS register 8

ifelse Example C int i; int j; int smaller; if (i < j) smaller = i; else smaller = j; Flattened C int i; int j; int smaller; if (i >= j) goto else1; smaller = i; goto endif1; else1: smaller = j; endif1: 9

ifelse Example Flattened C int i; int j; int smaller; else1: if (i >= j) goto else1; smaller = i; goto endif1; smaller = j; endif1: Note: jmp instruction (unconditional jump) Assem Lang.section ".bss" i:.skip 4 j:.skip 4 smaller:.skip 4.section ".text" movl i, %eax cmpl j, %eax jge else1 movl i, %eax movl %eax, smaller jmp endif1 else1: movl j, %eax movl %eax, smaller endif1: 10

while Example C int fact; int n; fact = 1; while (n > 1) { fact *= n; n--; } Flattened C int fact; int n; fact = 1; loop1: if (n <= 1) goto endloop1; fact *= n; n--; goto loop1; endloop1: 11

while Example Flattened C int fact; int n; loop1: fact = 1; if (n <= 1) goto endloop1; fact *= n; n--; goto loop1; endloop1: Note: jle instruction (conditional jump) imul instruction Assem Lang.section ".bss" fact:.skip 4 n:.skip 4.section ".text" movl $1, fact loop1: cmpl $1, n jle endloop1 movl fact, %eax imull n movl %eax, fact decl n jmp loop1 endloop1: 12

for Example C int power = 1; int base; int exp; int i; for (i = 0; i < exp; i++) power *= base; Flattened C int power = 1; int base; int exp; int i; i = 0; loop1: if (i >= exp) goto endloop1; power *= base; i++; goto loop1; endloop1: 13

for Example Flattened C int power = 1; int base; int exp; int i; loop1: i = 0; if (i >= exp) goto endloop1; power *= base; i++; goto loop1; endloop1: Assem Lang.section ".data" power:.long 1.section ".bss" base:.skip 4 exp:.skip 4 i:.skip 4.section ".text movl $0, i loop1: movl i, %eax cmpl exp, %eax jge endloop1 movl power, %eax imull base movl %eax, power incl i jmp loop1 endloop1: 14

Control Flow with Signed Integers Comparing signed integers cmp{q,l,w,b} srcirm, destrm Compare dest with src Sets condition-code bits in the EFLAGS register Beware: operands are in counterintuitive order Beware: many other instructions set condition-code bits Conditional jump should immediately follow cmp 15

Control Flow with Signed Integers Unconditional jump jmp label Jump to label Conditional jumps after comparing signed integers je label Jump to label if equal jne label Jump to label if not equal jl label Jump to label if less jle label Jump to label if less or equal jg label Jump to label if greater jge label Jump to label if greater or equal Examine CC bits in EFLAGS register 16

Agenda Flattened C Control flow with signed integers Control flow with unsigned integers Assembly Language: Defining global data Arrays Structures 17

Signed vs. Unsigned Integers In C Integers are signed or unsigned Compiler generates assem lang instructions accordingly In assembly language Integers are neither signed nor unsigned Distinction is in the instructions used to manipulate them Distinction matters for Multiplication and division Control flow 18

Handling Unsigned Integers Multiplication and division Signed integers: imul, idiv Unsigned integers: mul, div Control flow Signed integers: cmp + {je, jne, jl, jle, jg, jge} Unsigned integers: unsigned cmp + {je, jne, jl, jle, jg, jge}? No!!! Unsigned integers: cmp + {je, jne, jb, jbe, ja, jae} 19

while Example C unsigned int fact; unsigned int n; fact = 1; while (n > 1) { fact *= n; n--; } Flattened C unsigned int fact; unsigned int n; fact = 1; loop1: if (n <= 1) goto endloop1; fact *= n; n--; goto loop1; endloop1: 20

while Example Flattened C unsigned int fact; unsigned int n; loop1: fact = 1; if (n <= 1) goto endloop1; fact *= n; n--; goto loop1; endloop1: Note: jbe instruction (instead of jle) mull instruction (instead of imull) Assem Lang.section ".bss" fact:.skip 4 n:.skip 4.section ".text" movl $1, fact loop1: cmpl $1, n jbe endloop1 movl fact, %eax mull n movl %eax, fact decl n jmp loop1 endloop1: 21

for Example C unsigned int power = 1; unsigned int base; unsigned int exp; unsigned int i; for (i = 0; i < exp; i++) power *= base; Flattened C unsigned int power = 1; unsigned int base; unsigned int exp; unsigned int i; i = 0; loop1: if (i >= exp) goto endloop1; power *= base; i++; goto loop1; endloop1: 22

for Example Flattened C unsigned int power = 1; unsigned int base; unsigned int exp; unsigned int i; loop1: i = 0; if (i >= exp) goto endloop1; power *= base; i++; goto loop1; endloop1: Note: jae instruction (instead of jge) mull instruction (instead of imull) Assem Lang.section ".data" power:.long 1.section ".bss" base:.skip 4 exp:.skip 4 i:.skip 4.section ".text movl $0, i loop1: movl i, %eax cmpl exp, %eax jae endloop1 movl power, %eax mull base movl %eax, power incl i jmp loop1 endloop1: 23

Control Flow with Unsigned Integers Comparing unsigned integers cmp{q,l,w,b} srcirm, destrm Compare dest with src (Same as comparing signed integers) Conditional jumps after comparing unsigned integers je label Jump to label if equal jne label Jump to label if not equal jb label Jump to label if below jbe label Jump to label if below or equal ja label Jump to label if above jae label Jump to label if above or equal Examine CC bits in EFLAGS register 24

Agenda Flattened C code Control flow with signed integers Control flow with unsigned integers Assembly Language: Defining global data Arrays Structures 25

RAM RAM (Random Access Memory) Control Unit CPU 0000000000000000 TEXT RODATA DATA BSS HEAP Registers ALU Data bus FFFFFFFFFFFFFFFF STACK RAM 26

Defining Data: DATA Section 1 static char c = 'a'; static short s = 12; static int i = 345; static long l = 6789; c: s: i: l:.section ".data".byte 'a'.word 12.long 345.quad 6789 Note:.section instruction (to announce DATA section) label definition (marks a spot in RAM).byte instruction (1 byte).word instruction (2 bytes).long instruction (4 bytes).quad instruction (8 bytes) Note: Best to avoid word (2 byte) data 27

Defining Data: DATA Section 2 char c = 'a'; short s = 12; int i = 345; long l = 6789;.section ".data".globl c c:.byte 'a'.globl s s:.word 12.globl i i:.long 345.globl l l:.quad 6789 Note: Can place label on same line as next instruction.globl instruction 28

Defining Data: BSS Section static char c; static short s; static int i; static long l; c: s: i: l:.section ".bss".skip 1.skip 2.skip 4.skip 8 Note:.section instruction (to announce BSS section).skip instruction 29

Defining Data: RODATA Section "hello\n";.section ".rodata" hellolabel:.string "hello\n" Note:.section instruction (to announce RODATA section).string instruction 30

Agenda Flattened C Control flow with signed integers Control flow with unsigned integers Assembly Language: Defining global data Arrays Structures 31

Arrays: Indirect Addressing C int a[100]; int i; int n; i = 3; n = a[i] Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movslq i, %rax salq $2, %rax addq $a, %rax movl (%rax), %r10d movl %r10d, n One step at a time 32

Arrays: Indirect Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movslq i, %rax salq $2, %rax addq $a, %rax movl (%rax), %r10d movl %r10d, n Registers RAX R10 a Memory 0 1 2 3 123 99 i 3 n 1000 1004 1008 1012 1396 1400 1404 33

Arrays: Indirect Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movslq i, %rax salq $2, %rax addq $a, %rax movl (%rax), %r10d movl %r10d, n Registers RAX 3 R10 a Memory 0 1 2 3 123 99 i 3 n 1000 1004 1008 1012 1396 1400 1404 34

Arrays: Indirect Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movslq i, %rax salq $2, %rax addq $a, %rax movl (%rax), %r10d movl %r10d, n Registers RAX 12 R10 a Memory 0 1 2 3 123 99 i 3 n 1000 1004 1008 1012 1396 1400 1404 35

Arrays: Indirect Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movslq i, %rax salq $2, %rax addq $a, %rax movl (%rax), %r10d movl %r10d, n Registers RAX 1012 R10 a Memory 0 1 2 3 123 99 i 3 n 1000 1004 1008 1012 1396 1400 1404 36

Arrays: Indirect Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movslq i, %rax salq $2, %rax addq $a, %rax movl (%rax), %r10d movl %r10d, n Registers RAX 1012 R10 123 a Memory 0 1 2 3 123 99 i 3 n 1000 1004 1008 1012 1396 1400 1404 Note: Indirect addressing 37

Arrays: Indirect Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movslq i, %rax salq $2, %rax addq $a, %rax movl (%rax), %r10d movl %r10d, n Registers RAX 1012 R10 123 a Memory 0 1 2 3 123 99 i 3 n 123 1000 1004 1008 1012 1396 1400 1404 38

Arrays: Base+Disp Addressing C int a[100]; int i; int n; i = 3; n = a[i] Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax sall $2, %eax movl a(%eax), %r10d movl %r10d, n One step at a time 39

Arrays: Base+Disp Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax sall $2, %eax movl a(%eax), %r10d movl %r10d, n Registers RAX R10 a Memory 0 1 2 3 123 99 i 3 n 1000 1004 1008 1012 1396 1400 1404 40

Arrays: Base+Disp Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax sall $2, %eax movl a(%eax), %r10d movl %r10d, n Registers RAX 3 R10 a Memory 0 1 2 3 123 99 i 3 n 1000 1004 1008 1012 1396 1400 1404 41

Arrays: Base+Disp Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax sall $2, %eax movl a(%eax), %r10d movl %r10d, n Registers RAX 12 R10 a Memory 0 1 2 3 123 99 i 3 n 1000 1004 1008 1012 1396 1400 1404 42

Arrays: Base+Disp Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax sall $2, %eax movl a(%eax), %r10d movl %r10d, n Registers RAX 12 R10 123 a Memory 0 1 2 3 123 99 i 3 n 1000 1004 1008 1012 1396 1400 1404 Note: Base+displacement addressing 43

Arrays: Base+Disp Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax sall $2, %eax movl a(%eax), %r10d movl %r10d, n Registers RAX 12 R10 123 a Memory 0 1 2 3 123 99 i 3 n 123 1000 1004 1008 1012 1396 1400 1404 44

Arrays: Scaled Indexed Addressing C int a[100]; int i; int n; i = 3; n = a[i] Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax movl a(,%eax,4), %r10d movl %r10d, n One step at a time 45

Arrays: Scaled Indexed Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax movl a(,%eax,4), %r10d movl %r10d, n Registers RAX R10 a Memory 0 1 2 3 123 99 i 3 1000 1004 1008 1012 1396 1400 n 1404 46

Arrays: Scaled Indexed Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax movl a(,%eax,4), %r10d movl %r10d, n Registers RAX 3 R10 a Memory 0 1 2 3 123 99 i 3 1000 1004 1008 1012 1396 1400 n 1404 47

Arrays: Scaled Indexed Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax movl a(,%eax,4), %r10d movl %r10d, n Registers RAX 3 R10 123 a Memory 0 1 2 3 123 99 i 3 1000 1004 1008 1012 1396 1400 n 1404 Note: Scaled indexed addressing 48

Arrays: Scaled Indexed Addressing Assem Lang.section ".bss" a:.skip 400 i:.skip 4 n:.skip 4.section ".text" movl $3, i movl i, %eax movl a(,%eax,4), %r10d movl %r10d, n Registers RAX 12 R10 123 a Memory 0 1 2 3 123 99 i 3 1000 1004 1008 1012 1396 1400 n 123 1404 49

Generalization: Memory Operands Full form of memory operands: displacement(base,index,scale) displacement is an integer or a label (default = 0) base is a 4-byte or 8-byte register index is a 4-byte or 8-byte register scale is 1, 2, 4, or 8 (default = 1) Meaning Compute the sum (displacement) + (contents of base) + ((contents of index) * (scale)) Consider the sum to be an address Load from (or store to) that address Note: All other forms are subsets of the full form 50

Generalization: Memory Operands Valid subsets: Direct addressing displacement Indirect addressing (base) Base+displacement addressing displacement(base) Indexed addressing (base, index) displacement(base,index) Scaled indexed addressing (,index, scale) displacement(,index,scale) (base,index,scale) displacement(base,index,scale) 51

Operand Examples Immediate operands $5 use the number 5 (i.e. the number that is available immediately within the instruction) $i use the address denoted by i (i.e. the address that is available immediately within the instruction) Register operands %rax read from (or write to) register RAX Memory operands: direct addressing 5 load from (or store to) memory at address 5 (silly; seg fault) i load from (or store to) memory at the address denoted by i Memory operands: indirect addressing (%rax) consider the contents of RAX to be an address; load from (or store to) that address 52

Operand Examples Memory operands: base+displacement addressing 5(%rax) compute the sum (5) + (contents of RAX); consider the sum to be an address; load from (or store to) that address i(%rax) compute the sum (address denoted by i) + (contents of RAX); consider the sum to be an address; load from (or store to) that address Memory operands: indexed addressing 5(%rax,%r10) compute the sum (5) + (contents of RAX) + (contents of R10); consider the sum to be an address; load from (or store to) that address i(%rax,%r10) compute the sum (address denoted by i) + (contents of RAX) + (contents of R10); consider the sum to be an address; load from (or store to) that address 53

Operand Examples Memory operands: scaled indexed addressing 5(%rax,%r10,4) compute the sum (5) + (contents of RAX) + ((contents of R10) * 4); consider the sum to be an address; load from (or store to) that address i(%rax,%r10,4) compute the sum (address denoted by i) + (contents of RAX) + ((contents of R10) * 4); consider the sum to be an address; load from (or store to) that address 54

Aside: The lea Instruction lea: load effective address Unique instruction: suppresses memory load/store Example movq 5(%rax), %r10 Compute the sum (5) + (contents of RAX); consider the sum to be an address; load 8 bytes from that address into R10 leaq 5(%rax), %r10 Compute the sum (5) + (contents of RAX); move that sum to R10 Useful for Computing an address, e.g. as a function argument See precept code that calls scanf() Some quick-and-dirty arithmetic What is the effect of this? leaq (%rax,%rax,4),%rax 55

Agenda Flattened C Control flow with signed integers Control flow with unsigned integers Assembly Language: Defining global data Arrays Structures 56

Structures: Indirect Addressing C struct S { int i; int j; }; struct S mystruct; mystruct.i = 18; mystruct.j = 19; Assem Lang.section ".bss" mystruct:.skip 8.section ".text" movq $mystruct, %rax movl $18, (%rax) movq $mystruct, %rax addq $4, %rax movl $19, (%rax) rax RAM Note: Indirect addressing 18 19 57

Structures: Base+Disp Addressing C struct S { int i; int j; }; struct S mystruct; mystruct.i = 18; mystruct.j = 19; Assem Lang.section ".bss" mystruct:.skip 8.section ".text" movq $mystruct, %rax movl $18, 0(%rax) movl $19, 4(%rax) rax RAM 18 19 58

Structures: Padding C struct S { char c; int i; }; struct S mystruct; mystruct.c = 'A'; mystruct.i = 18; Three-byte pad here Assem Lang.section ".bss" mystruct:.skip 8.section ".text" movq $mystruct, %rax movb $'A', 0(%rax) movl $18, 4(%rax) Beware: Compiler sometimes inserts padding after fields 59

Structures: Padding x86-64/linux rules Data type (unsigned) char 1 (unsigned) short 2 (unsigned) int 4 (unsigned) long 8 float 4 double 8 long double 16 any pointer 8 Within a struct, must begin at address that is evenly divisible by: Compiler may add padding after last field if struct is within an array 60

Summary Intermediate aspects of x86-64 assembly language Flattened C code Control transfer with signed integers Control transfer with unsigned integers Arrays Full form of instruction operands Structures Padding 61

Appendix Setting and using CC bits in EFLAGS register 62

Setting Condition Code Bits Question How does cmp{q,l,w,b} set condition code bits in EFLAGS register? Answer (See following slides) 63

Condition Code Bits Condition code bits ZF: zero flag: set to 1 iff result is zero SF: sign flag: set to 1 iff result is negative CF: carry flag: set to 1 iff unsigned overflow occurred OF: overflow flag: set to 1 iff signed overflow occurred 64

Condition Code Bits Example: addq src, dest Compute sum (dest+src) Assign sum to dest ZF: set to 1 iff sum == 0 SF: set to 1 iff sum < 0 CF: set to 1 iff unsigned overflow Set to 1 iff sum<src OF: set if signed overflow Set to 1 iff (src>0 && dest>0 && sum<0) (src<0 && dest<0 && sum>=0) 65

Condition Code Bits Example: subq src, dest Compute sum (dest+(-src)) Assign sum to dest ZF: set to 1 iff sum == 0 SF: set to 1 iff sum < 0 CF: set to 1 iff unsigned overflow Set to 1 iff dest<src OF: set to 1 iff signed overflow Set to 1 iff (dest>0 && src<0 && sum<0) (dest<0 && src>0 && sum>=0) Example: cmpq src, dest Same as subq But does not affect dest 66

Using Condition Code Bits Question How do conditional jump instructions use condition code bits in EFLAGS register? Answer (See following slides) 67

Conditional Jumps: Unsigned After comparing unsigned data Jump Instruction je label jne label jb label jae label jbe label ja label Use of CC Bits ZF ~ZF CF ~CF CF ZF ~(CF ZF) Note: If you can understand why jb jumps iff CF then the others follow 68

Conditional Jumps: Unsigned Why does jb jump iff CF? Informal explanation: (1) largenum smallnum (not below) Correct result CF=0 don t jump (2) smallnum largenum (below) Incorrect result CF=1 jump 69

Conditional Jumps: Signed After comparing signed data Jump Instruction je label jne label jl label jge label jle label jg label Use of CC Bits ZF ~ZF OF ^ SF ~(OF ^ SF) (OF ^ SF) ZF ~((OF ^ SF) ZF) Note: If you can understand why jl jumps iff OF^SF then the others follow 70

Conditional Jumps: Signed Why does jl jump iff OF^SF? Informal explanation: (1) largeposnum smallposnum (not less than) Certainly correct result OF=0, SF=0, OF^SF==0 don t jump (2) smallposnum largeposnum (less than) Certainly correct result OF=0, SF=1, OF^SF==1 jump (3) largenegnum smallnegnum (less than) Certainly correct result OF=0, SF=1 (OF^SF)==1 jump (4) smallnegnum largenegnum (not less than) Certainly correct result OF=0, SF=0 (OF^SF)==0 don't jump 71

Conditional Jumps: Signed (5) posnum negnum (not less than) Suppose correct result OF=0, SF=0 (OF^SF)==0 don't jump (6) posnum negnum (not less than) Suppose incorrect result OF=1, SF=1 (OF^SF)==0 don't jump (7) negnum posnum (less than) Suppose correct result OF=0, SF=1 (OF^SF)==1 jump (8) negnum posnum (less than) Suppose incorrect result OF=1, SF=0 (OF^SF)==1 jump 72

Appendix Big-endian vs little-endian byte order 73

Byte Order x86-64 is a little endian architecture Least significant byte of multi-byte entity is stored at lowest memory address Little end goes first The int 5 at address 1000: Some other systems use big endian Most significant byte of multi-byte entity is stored at lowest memory address Big end goes first The int 5 at address 1000: 1000 1001 1002 1003 1000 1001 1002 1003 00000101 00000000 00000000 00000000 00000000 00000000 00000000 00000101 74

Byte Order Example 1 #include <stdio.h> int main(void) { unsigned int i = 0x003377ff; unsigned char *p; int j; p = (unsigned char *)&i; for (j=0; j<4; j++) printf("byte %d: %2x\n", j, p[j]); } Output on a little-endian machine Byte 0: ff Byte 1: 77 Byte 2: 33 Byte 3: 00 Output on a big-endian machine Byte 0: 00 Byte 1: 33 Byte 2: 77 Byte 3: ff 75

Byte Order Example 2 Note: Flawed code; uses b instructions to manipulate a four-byte memory area x86-64 is little endian, so what will be the value of grade?.section ".data" grade:.long 'B'.section ".text" # Option 1 movb grade, %al subb $1, %al movb %al, grade # Option 2 subb $1, grade What would be the value of grade if x86-64 were big endian? 76

Byte Order Example 3 Note: Flawed code; uses l instructions to manipulate a one-byte memory area What would happen?.section ".data" grade:.byte 'B'.section ".text" # Option 1 movl grade, %eax subl $1, %eax movl %eax, grade # Option 2 subl $1, grade 77