Assembly Programming III CSE 351 Spring 2017

Slides:



Advertisements
Similar presentations
Fabián E. Bustamante, Spring 2007 Machine-Level Programming II: Control Flow Today Condition codes Control flow structures Next time Procedures.
Advertisements

Machine/Assembler Language Putting It All Together Noah Mendelsohn Tufts University Web:
The CPU Revision Typical machine code instructions Using op-codes and operands Symbolic addressing. Conditional and unconditional branches.
Flow Control Instructions
Machine-Level Programming II: Control Flow Topics Condition codes Conditional branches Loops Switch statements CS 105 “Tour of the Black Holes of Computing”
1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Carnegie Mellon Machine-Level Programming II: Control : Introduction.
1 Carnegie Mellon Assembly and Bomb Lab : Introduction to Computer Systems Recitation 4, Sept. 17, 2012.
COMP 2003: Assembly Language and Digital Logic Chapter 2: Flags and Instructions Notes by Neil Dickson.
1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Carnegie Mellon Machine-Level Programming II: Control Carnegie Mellon.
University of Washington x86 Programming II The Hardware/Software Interface CSE351 Winter 2013.
Lecture 7 Flow of Control Topics Finish Lecture 6 slides Lab 02 = datalab comments Assembly Language flow of control Test 1 – a week from wednesday February.
Carnegie Mellon Machine-Level Programming II: Arithmetic & Control /18-243: Introduction to Computer Systems 6th Lecture, 5 June 2012 Carnegie Mellon.
Assembly תרגול 7 תכנות באסמבלי, המשך. Condition Codes Single bit registers  CF – carry flag  ZF – zero flag  SF – sign flag  OF – overflow flag Relevant.
Machine-Level Programming 2 Control Flow Topics Condition Codes Setting Testing Control Flow If-then-else Varieties of Loops Switch Statements.
1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Carnegie Mellon Machine-Level Programming IV Control Comp 21000: Introduction.
Machine-Level Programming 2 Control Flow
Samira Khan University of Virginia Feb 2, 2017
Assembly Programming II CSE 351 Spring 2017
Conditional Branch Example
Homework Reading Labs PAL, pp
Computer Architecture
The Stack & Procedures CSE 351 Spring 2017
Morgan Kaufmann Publishers Computer Organization and Assembly Language
Assembly Programming III CSE 410 Winter 2017
Assembly Language Programming Part 2
Machine-Level Programming II: Arithmetic & Control
Machine-Level Programming II: Control
Machine-Level Representation of Programs II
Roadmap C: Java: Assembly language: OS: Machine code: Computer system:
Machine-Level Programming II: Control Flow
x86 Programming II CSE 351 Autumn 2016
x86-64 Programming II CSE 351 Autumn 2017
Carnegie Mellon Machine-Level Programming II: Control : Introduction to Computer Systems 6th Lecture, Sept. 13, 2018.
Controlling Program Flow
Assembly Programming IV CSE 351 Spring 2017
x86-64 Programming II CSE 351 Winter 2018
Roadmap C: Java: Assembly language: OS: Machine code: Computer system:
Machine-Level Programming III: Procedures /18-213/14-513/15-513: Introduction to Computer Systems 7th Lecture, September 18, 2018.
Assembly Programming III CSE 351 Spring 2017
Instructor: David Ferry
Carnegie Mellon Machine-Level Programming III: Procedures : Introduction to Computer Systems October 22, 2015 Instructor: Rabi Mahapatra Authors:
Processor Architecture: The Y86-64 Instruction Set Architecture
Machine-Level Programming: Control Flow
Machine-Level Programming 2 Control Flow
Machine-Level Programming 2 Control Flow
Processor Architecture: The Y86-64 Instruction Set Architecture
Assembly Programming II CSE 410 Winter 2017
Machine-Level Representation of Programs III
Machine-Level Programming 2 Control Flow
Homework Reading Machine Projects Labs PAL, pp
x86 Programming III CSE 351 Autumn 2016
Carnegie Mellon Ithaca College
x86-64 Programming II CSE 351 Summer 2018
x86-64 Programming III CSE 351 Autumn 2018
x86-64 Programming II CSE 351 Autumn 2018
Machine-Level Programming II: Control Flow
X86 Assembly Review.
EECE.3170 Microprocessor Systems Design I
X86 Assembly - Control.
Machine-Level Programming II: Control Flow Sept. 12, 2007
Carnegie Mellon Ithaca College
Carnegie Mellon Ithaca College
x86-64 Programming II CSE 351 Winter 2019
Carnegie Mellon Ithaca College
CS201- Lecture 8 IA32 Flow Control
Chapter 8: Instruction Set 8086 CPU Architecture
x86-64 Programming III CSE 351 Winter 2019
Carnegie Mellon Ithaca College
Credits and Disclaimers
Presentation transcript:

Assembly Programming III CSE 351 Spring 2017 Guest Lecturer: Justin Hsia Instructor: Ruth Anderson Teaching Assistants: Dylan Johnson Kevin Bi Linxing Preston Jiang Cody Ohlsen Yufang Sun Joshua Curtis

Administrivia Lab 1 due TONIGHT, Friday (4/14) Remember, you have late days available if needed. Homework 2 due next Wednesday (4/19) Lab 2 (x86-64) released soon! Learn to read x86-64 assembly and use GDB

x86 Control Flow Condition codes Conditional and unconditional branches Loops Switches

Processor State (x86-64, partial) Information about currently executing program Temporary data ( %rax, … ) Location of runtime stack ( %rsp ) Location of current code control point ( %rip, … ) Status of recent tests ( CF, ZF, SF, OF ) Single bit registers: Registers %rsp %r8 %r9 %r10 %r11 %r12 %r13 %r14 %r15 %rax %rbx %rcx %rdx %rsi %rdi %rbp current top of the Stack Program Counter (instruction pointer) %rip CF ZF SF OF Condition Codes

Condition Codes (Implicit Setting) Implicitly set by arithmetic operations (think of it as side effects) Example: addq src, dst ↔ r = d+s CF=1 if carry out from MSB (unsigned overflow) ZF=1 if r==0 SF=1 if r<0 (assuming signed, actually just if MSB is 1) OF=1 if two’s complement (signed) overflow (s>0 && d>0 && r<0)||(s<0 && d<0 && r>=0) Not set by lea instruction (beware!) CF ZF SF OF Carry Flag Zero Flag Sign Flag Overflow Flag

Condition Codes (Explicit Setting: Compare) Explicitly set by Compare instruction cmpq src1, src2 cmpq a, b sets flags based on b-a, but doesn’t store CF=1 if carry out from MSB (used for unsigned comparison) ZF=1 if a==b SF=1 if (b-a)<0 (signed) OF=1 if two’s complement (signed) overflow (b>0 && a<0 && (b-a)<0) || (b<0 && a>0 && (b-a)>0) CF ZF SF OF Carry Flag Zero Flag Sign Flag Overflow Flag

Condition Codes (Explicit Setting: Test) Explicitly set by Test instruction testq src2, src1 testq a, b sets flags based on b&a, but doesn’t store Useful to have one of the operands be a mask Can’t have carry out (CF) or overflow (OF) ZF=1 if a&b==0 SF=1 if a&b<0 (signed) Example: testq %rax, %rax Tells you if (+), 0, or (−) based on ZF and SF CF ZF SF OF Carry Flag Zero Flag Sign Flag Overflow Flag

Using Condition Codes: Jumping j* Instructions Jumps to target (an address) based on condition codes Instruction Condition Description jmp target 1 Unconditional je target ZF Equal / Zero jne target ~ZF Not Equal / Not Zero js target SF Negative jns target ~SF Nonnegative jg target ~(SF^OF)&~ZF Greater (Signed) jge target ~(SF^OF) Greater or Equal (Signed) jl target (SF^OF) Less (Signed) jle target (SF^OF)|ZF Less or Equal (Signed) ja target ~CF&~ZF Above (unsigned “>”) jb target CF Below (unsigned “<“) Bunch of different jump instructions First, unconditional

Using Condition Codes: Setting set* Instructions Set low-order byte of dst to 0 or 1 based on condition codes Does not alter remaining 7 bytes Instruction Condition Description sete dst ZF Equal / Zero setne dst ~ZF Not Equal / Not Zero sets dst SF Negative setns dst ~SF Nonnegative setg dst ~(SF^OF)&~ZF Greater (Signed) setge dst ~(SF^OF) Greater or Equal (Signed) setl dst (SF^OF) Less (Signed) setle dst (SF^OF)|ZF Less or Equal (Signed) seta dst ~CF&~ZF Above (unsigned “>”) setb dst CF Below (unsigned “<”)

Reminder: x86-64 Integer Registers Accessing the low-order byte: %rsp %spl %r8b %r8 %r9b %r9 %r10b %r10 %r11b %r11 %r12b %r12 %r13b %r13 %r14b %r14 %r15b %r15 %al %rax %bl %rbx %cl %rcx %dl %rdx %sil %rsi %dil %rdi %bpl %rbp

Reading Condition Codes Register Use(s) %rdi 1st argument (x) %rsi 2nd argument (y) %rax return value Reading Condition Codes set* Instructions Set a low-order byte to 0 or 1 based on condition codes Operand is byte register (e.g. al, dl) or a byte in memory Do not alter remaining bytes in register Typically use movzbl (zero-extended mov) to finish job int gt(long x, long y) { return x > y; } Zero-extend: sets the upper bytes to 0 The order of the cmpq operands is backwards, unfortunately; first we do cmpq y, x, but then the setg is “true” if x > y. So, think of the cmpq as performing x – y, like a sub instruction, and then it makes more sense. cmpq %rsi, %rdi # setg %al # movzbl %al, %eax # ret

Reading Condition Codes Register Use(s) %rdi 1st argument (x) %rsi 2nd argument (y) %rax return value Reading Condition Codes set* Instructions Set a low-order byte to 0 or 1 based on condition codes Operand is byte register (e.g. al, dl) or a byte in memory Do not alter remaining bytes in register Typically use movzbl (zero-extended mov) to finish job int gt(long x, long y) { return x > y; } Zero-extend: sets the upper bytes to 0 The order of the cmpq operands is backwards, unfortunately; first we do cmpq y, x, but then the setg is “true” if x > y. So, think of the cmpq as performing x – y, like a sub instruction, and then it makes more sense. cmpq %rsi, %rdi # Compare x:y setg %al # Set when > movzbl %al, %eax # Zero rest of %rax ret

Aside: movz and movs movz_ _ src, regDest Move with zero extension movs_ _ src, regDest Move with sign extension Copy from a smaller source value to a larger destination Source can be memory or register; Destination must be a register Fill remaining bits of dest with zero (movz) or sign bit (movs) movzSD / movsSD: S – size of source (b = 1 byte, w = 2) D – size of dest (w = 2 bytes, l = 4, q = 8) Example: movzbq %al, %rbx 0x?? 0xFF ←%rax 0x00 0xFF ←%rbx

Aside: movz and movs movz_ _ src, regDest Move with zero extension movs_ _ src, regDest Move with sign extension Copy from a smaller source value to a larger destination Source can be memory or register; Destination must be a register Fill remaining bits of dest with zero (movz) or sign bit (movs) movzSD / movsSD: S – size of source (b = 1 byte, w = 2) D – size of dest (w = 2 bytes, l = 4, q = 8) Example: movsbl (%rax), %ebx Note: In x86-64, any instruction that generates a 32-bit (long word) value for a register also sets the high-order portion of the register to 0. Good example on p. 184 in the textbook. 0x00 0x7F 0xFF 0xC6 0x1F 0xA4 0xE8 ←%rax ... 0x?? 0x80 ← MEM Copy 1 byte from memory into 8-byte register & sign extend it 0x00 0xFF 0x80 ←%rbx

Choosing instructions for conditionals All arithmetic instructions set condition flags based on result of operation (op) Conditionals are comparisons against 0 Come in instruction pairs (op) s, d je “Equal” d (op) s == 0 jne “Not equal” d (op) s != 0 js “Sign” (negative) d (op) s < 0 jns (non-negative) d (op) s >= 0 jg “Greater” d (op) s > 0 jge “Greater or equal” jl “Less” jle ”Less or equal” d (op) s <= 0 ja “Above” (unsigned >) d (op) s > 0U jb “Below” (unsigned <) d (op) s < 0U addq 5, (p) je: *p+5 == 0 jne: *p+5 != 0 jg: *p+5 > 0 jl: *p+5 < 0 First set flags explicitly using CMP or TEST, then jump appropriately: - use CMP for comparing two variables - use TEST for comparing with 0, e.g. with a mask orq a, b je: b|a == 0 . jne: b|a != 0 . jg: b|a > 0 . jl: b|a < 0 .

Choosing instructions for conditionals Reminder: cmp is like sub, test is like and Result is not stored anywhere cmpq 5, (p) je: *p == 5 . jne: *p != 5 . jg: *p > 5 . jl: *p < 5 . cmp a,b test a,b je “Equal” b == a b&a == 0 jne “Not equal” b != a b&a != 0 js “Sign” (negative) b-a < 0 b&a < 0 jns (non-negative) b-a >=0 b&a >= 0 jg “Greater” b > a b&a > 0 jge “Greater or equal” b >= a jl “Less” b < a jle ”Less or equal” b <= a b&a <= 0 ja “Above” (unsigned >) b&a > 0U jb “Below” (unsigned <) b&a < 0U testq a, a je: a == 0 . jne: a != 0 . jg: a > 0 . jl: a < 0 . First set flags explicitly using CMP or TEST, then jump appropriately: - use CMP for comparing two variables - use TEST for comparing with 0, e.g. with a mask testb a, 0x1 je: aLSB == 0. jne: aLSB == 1.

Choosing instructions for conditionals Register Use(s) %rdi argument x %rsi argument y %rax return value cmp a,b test a,b je “Equal” b == a b&a == 0 jne “Not equal” b != a b&a != 0 js “Sign” (negative) b-a < 0 b&a < 0 jns (non-negative) b-a >=0 b&a >= 0 jg “Greater” b > a b&a > 0 jge “Greater or equal” b >= a jl “Less” b < a jle ”Less or equal” b <= a b&a <= 0 ja “Above” (unsigned >) b&a > 0U jb “Below” (unsigned <) b&a < 0U if (x < 3) { return 1; } return 2; T1: # x < 3: movq $1, %rax ret T2: # !(x < 3): movq $2, %rax cmpq $3, %rdi jge T2 use CMP for comparing two variables use TEST for comparing with 0, e.g. with a mask

Question cmpq %rsi, %rdi jle .L4 cmpq %rsi, %rdi jg .L4 long absdiff(long x, long y) { long result; if (x > y) result = x-y; else result = y-x; return result; } Question Register Use(s) %rdi 1st argument (x) %rsi 2nd argument (y) %rax return value absdiff: __________________ # x > y: movq %rdi, %rax subq %rsi, %rax ret .L4: # x <= y: movq %rsi, %rax subq %rdi, %rax cmpq %rsi, %rdi jle .L4 cmpq %rsi, %rdi jg .L4 testq %rsi, %rdi jle .L4 testq %rsi, %rdi jg .L4 We’re lost…

Choosing instructions for conditionals if (x < 3 && x == y) { return 1; } else { return 2; } cmp a,b test a,b je “Equal” b == a b&a == 0 jne “Not equal” b != a b&a != 0 js “Sign” (negative) b-a < 0 b&a < 0 jns (non-negative) b-a >=0 b&a >= 0 jg “Greater” b > a b&a > 0 jge “Greater or equal” b >= a jl “Less” b < a jle ”Less or equal” b <= a b&a <= 0 ja “Above” (unsigned >) b&a > 0U jb “Below” (unsigned <) b&a < 0U cmpq $3, %rdi setl %al T1: # x < 3 && x == y: movq $1, %rax ret T2: # else movq $2, %rax cmpq %rsi, %rdi sete %bl testb %al, %bl je T2 x -> %rdi y -> %rsi ret -> %rax %al = (x<3) %bl = (x==y) If either is false (0), then %al & %bl = 0 (jump to T2).

Choosing instructions for conditionals if (x < 3 && x == y) { return 1; } else { return 2; } cmp a,b test a,b je “Equal” b == a b&a == 0 jne “Not equal” b != a b&a != 0 js “Sign” (negative) b-a < 0 b&a < 0 jns (non-negative) b-a >=0 b&a >= 0 jg “Greater” b > a b&a > 0 jge “Greater or equal” b >= a jl “Less” b < a jle ”Less or equal” b <= a b&a <= 0 ja “Above” (unsigned >) b&a > 0U jb “Below” (unsigned <) b&a < 0U T1: # x < 3 && x == y: movq $1, %rax ret T2: # else movq $2, %rax cmpq $3, %rdi setl %al cmpq %rsi, %rdi sete %bl testb %al, %bl je T2 For Compiler Explorer, show –Og option and contrast with –O1 option. https://godbolt.org/g/Ovh3jN

Summary Control flow in x86 determined by status of Condition Codes Showed Carry, Zero, Sign, and Overflow, though others exist Set flags with arithmetic instructions (implicit) or Compare and Test (explicit) Set instructions read out flag values Jump instructions use flag values to determine next instruction to execute

BONUS SLIDES Bonus content (nonessential). Does contain examples. CSE351 Lecture 10 BONUS SLIDES Bonus content (nonessential). Does contain examples. Conditional Operator with Jumps Conditional Move

Conditional Operator with Jumps CSE351 Lecture 10 Bonus Content (nonessential) Conditional Operator with Jumps C Code if (Test) val = Then-Expr; else val = Else-Expr; val = Test ? Then-Expr : Else-Expr; Example: result = x>y ? x-y : y-x; Ternary operator ?: Test is expression returning integer = 0 interpreted as false ≠ 0 interpreted as true Create separate code regions for then & else expressions Execute appropriate one Goto Version ntest = !Test; if (ntest) goto Else; val = Then_Expr; goto Done; Else: val = Else_Expr; Done: . . . You may not have seen this operator before Call it a “ternary” operator because it takes 3 operands Conditional operator, tests condition,

Conditional Move Conditional Move Instructions: cmovC src, dst CSE351 Lecture 10 Bonus Content (nonessential) more details at end of slides Conditional Move Conditional Move Instructions: cmovC src, dst Move value from src to dst if condition C holds if(Test) Dest ← Src GCC tries to use them (but only when known to be safe) Why is this useful? Branches are very disruptive to instruction flow through pipelines Conditional moves do not require control transfer absdiff: movq %rdi, %rax # x subq %rsi, %rax # result=x-y movq %rsi, %rdx subq %rdi, %rdx # else_val=y-x cmpq %rsi, %rdi # x:y cmovle %rdx, %rax # if <=, ret # result=else_val long absdiff(long x, long y) { return x>y ? x-y : y-x; }

Using Conditional Moves CSE351 Lecture 10 Bonus Content (nonessential) Using Conditional Moves Conditional Move Instructions cmovC src, dest Move value from src to dest if condition C holds Instruction supports: if (Test) Dest  Src Supported in post-1995 x86 processors GCC tries to use them But, only when known to be safe Why is this useful? Branches are very disruptive to instruction flow through pipelines Conditional moves do not require control transfer C Code val = Test ? Then_Expr : Else_Expr; “Goto” Version result = Then_Expr; else_val = Else_Expr; nt = !Test; if (nt) result = else_val; return result;

Conditional Move Example CSE351 Lecture 10 Bonus Content (nonessential) Conditional Move Example long absdiff(long x, long y) { long result; if (x > y) result = x-y; else result = y-x; return result; } Register Use(s) %rdi Argument x %rsi Argument y %rax Return value absdiff: movq %rdi, %rax # x subq %rsi, %rax # result = x-y movq %rsi, %rdx subq %rdi, %rdx # else_val = y-x cmpq %rsi, %rdi # x:y cmovle %rdx, %rax # if <=, result = else_val ret More efficient than conditional branching (simple control flow) But overhead: both branches are evaluated cmov instructions available in IA32 since 1995, but not used by gcc unless –march=686 flag used. They are used regularly in x86-64.

Bad Cases for Conditional Move CSE351 Lecture 10 Bonus Content (nonessential) Bad Cases for Conditional Move Expensive Computations val = Test(x) ? Hard1(x) : Hard2(x); Both values get computed Only makes sense when computations are very simple Risky Computations val = p ? *p : 0; Both values get computed May have undesirable effects Computations with side effects val = x > 0 ? x*=7 : x+=3; Both values get computed Must be side-effect free