control flow
play

Control flow Condition codes Conditional and unconditional jumps - PowerPoint PPT Presentation

Control flow Condition codes Conditional and unconditional jumps Loops Switch statements 1 Conditionals and Control Flow Familiar C constructs l if else l while l do while l for l break l continue Two key pieces 1. Comparisons and tests:


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

  2. Conditionals and Control Flow Familiar C constructs l if else l while l do while l for l break l continue Two key pieces 1. Comparisons and tests: check conditions 2. Transfer control: choose next instruction 2

  3. Processor Control-Flow State Condition codes (a.k.a. flags ) 1-bit registers hold flags set by last ALU operation Zero Flag result == 0 ZF SF Sign Flag result < 0 Carry Flag carry-out/unsigned overflow CF Overflow Flag two's complement overflow OF Instruction pointer %eip (a.k.a. program counter ) register holds address of next instruction to execute 3

  4. ex 1. compare and test : conditions b,a computes a - b , sets flags, discards result cmpl Which flags indicate that a < b ? (signed? unsigned?) testl b,a computes a & b , sets flags, discards result Common pattern: testl %eax, %eax What do ZF and SF indicate? 5

  5. Aside: save conditions setg: set if greater int gt (int x, int y) { return x > y; stores byte: 0x01 if ~(SF^OF)&~ZF } 0x00 otherwise movl 12(%ebp),%eax # eax = y cmpl %eax,8(%ebp) # compare: x – y setg %al # al = x > y movzbl %al,%eax # zero rest of %eax %eax %ah %al Z ero-extend from B yte (8 bits) to L ongword (32 bits) 6

  6. 2. jump : choose next instruction Jump/branch to different part of code by setting %eip . jX Condition Description Unconditional Always jump jmp 1 Equal / Zero je ZF Not Equal / Not Zero jne ~ZF Negative js SF Nonnegative jns ~SF Greater (Signed) jg ~(SF^OF)&~ZF Jump iff condition Greater or Equal (Signed) jge ~(SF^OF) Less (Signed) jl (SF^OF) Less or Equal (Signed) jle (SF^OF)|ZF Above (unsigned) ja ~CF&~ZF Below (unsigned) jb CF 8

  7. Jump for control flow Jump immediately follows comparison/test. Together, they make a decision: "if %eax = %ebx , jump to label." cmpl %eax,%ebx je label … Executed only if … %eax ≠ %ebx … label: addl %edx,%eax Label Name for address of following instruction. 9

  8. Conditional Branch Example int absdiff(int x,int y) { int result; if (x > y) { absdiff: result = x-y; pushl %ebp } else { Setup movl %esp, %ebp result = y-x; movl 8(%ebp), %edx } movl 12(%ebp), %eax return result; cmpl %eax, %edx Body } jle .L7 subl %eax, %edx movl %edx, %eax .L8: leave Finish Labels ret .L7: Name for address of subl %edx, %eax following instruction. Body jmp .L8 How did the compiler create this? 10

  9. Introduced by Fran Allen, et al. Control-Flow Graph Won the 2006 Turing Award for her work on compilers. Code flowchart/directed graph. int absdiff(int x, int y) { Nodes = Basic Blocks : int result; Straight-line code always if (x > y) { executed together in order. result = x-y; } else { result = y-x; } int result; return result; if (x > y) else } else then Edges = Control Flow : result = y-x; result = x-y; Which basic block executes next (under what condition). return result;

  10. Choose a linear order of basic blocks. int result; int result; if (x > y) else if (!(x > y)) result = x-y; result = y-x; result = y-x; result = x-y; return result; return result;

  11. Choose a linear order of basic blocks. int result; if (!(x > y)) result = x-y; return result; result = y-x; Why might the compiler choose this basic block order instead of another valid order?

  12. Translate basic blocks with jumps + labels pushl %ebp int result; movl %esp, %ebp movl 8(%ebp), %edx if (!(x > y)) movl 12(%ebp), %eax cmpl %eax, %edx jle Else result = x-y; subl %eax, %edx movl %edx, %eax return result; End: leave ret result = y-x; Else: subl %edx, %eax jmp End Why might the compiler choose this basic block order instead of another valid order?

  13. ex Execute absdiff Registers %eax pushl %ebp Start here. movl %esp, %ebp %edx movl 8(%ebp), %edx movl 12(%ebp), %eax %esp cmpl %eax, %edx jle Else %ebp 0x104 subl %eax, %edx Memory (Address) movl %edx, %eax … 0x118 End: Offset … 0x114 from %ebp Stop here. leave 12 123 0x110 What is in %eax? ret 8 456 0x10c Else: 4 0x108 Return addr subl %edx, %eax 0 … 0x104 %ebp jmp End -4 … 0x100 15

  14. Note: CSAPP shows translation with goto int absdiff(int x, int y) { int goto_ad(int x, int y) { int result; int result; if (x > y) { if (x <= y) goto Else ; result = x-y; result = x-y; } else { End : result = y-x; return result; } Else: return result; result = y-x; } goto End ; } 16

  15. Note: CSAPP shows translation with goto int goto_ad(int x, int y) { int result; if (x <= y) goto Else ; result = x-y; absdiff: End : pushl %ebp Setup return result; movl %esp, %ebp Else: movl 8(%ebp), %edx result = y-x; movl 12(%ebp), %eax goto End ; cmpl %eax, %edx Body } jle .L7 subl %eax, %edx movl %edx, %eax .L8: leave Finish ret Close to assembly code. .L7: subl %edx, %eax Body jmp .L8 17

  16. But never use goto in your source code! http://xkcd.com/292/ 18

  17. ex compile if-else int wacky(int x, int y) { int result; if (x + y > 7) { result = x; } else { result = y + 2; } return result; } Assume x available in 8(%ebp), y available in 12(%ebp). Place result in %eax.

  18. PC-relative addressing 0x100 cmp %eax, %ebx 0x1000 0x102 je 0x70 0x1002 0x104 … 0x1004 … … … 0x174 add %eax, %ebx 0x1074 l Jump instruction encodes offset from next instruction to destination PC. (Not the absolute address of the destination.) l PC relative branches are relocatable l Absolute branches are not (or they take a lot work to relocate) l 26

  19. PC-relative addressing objdump output: 00000000 <absdiff>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 10 sub $0x10,%esp 6: 8b 45 08 mov 0x8(%ebp),%eax 9: 3b 45 0c cmp 0xc(%ebp),%eax c: 7e 0b jle 19 <absdiff+0x19> e : 8b 45 08 mov 0x8(%ebp),%eax 11: 2b 45 0c sub 0xc(%ebp),%eax 14: 89 45 fc mov %eax,-0x4(%ebp) 17: eb 09 jmp 22 <absdiff+0x22> 19 : 8b 45 0c mov 0xc(%ebp),%eax 1c: 2b 45 08 sub 0x8(%ebp),%eax 1f: 89 45 fc mov %eax,-0x4(%ebp) 22 : 8b 45 fc mov -0x4(%ebp),%eax 25: c9 leave 26: c3 ret How are the jump targets encoded? Why?

  20. Compiling Loops C/Java code: Machine code: loopTop: cmpl $0, %eax while ( sum != 0 ) { je loopDone <loop body> <loop body code> } jmp loopTop loopDone: How to compile other loops should be straightforward The only slightly tricky part is to where to put the conditional branch: top or bottom of the loop 28

  21. “Do-While” Loop Example int result = 1; C Code int fact_do(int x) { int result = 1; result = result*x; do { x = x-1; result = result * x; x = x-1; } while (x > 1); (x > 1) ? return result; } return result; Keys: • Use backward branch to continue looping • Only take branch when “while” condition holds 30

  22. “Do-While” Loop Example C Code Goto Version int fact_do(int x) { int fact_goto(int x) { int result = 1; int result = 1; do { loop: result = result * x; result = result * x; x = x-1; x = x-1; } while (x > 1); if (x > 1) goto loop ; return result; return result; } } Keys: • Use backward branch to continue looping • Only take branch when “while” condition holds 31

  23. “Do-While” Loop Compilation Register Variable %edx Goto Version Assembly %eax int fact_goto(int x) { fact_goto: int result = 1; pushl %ebp # Setup movl %esp,%ebp # Setup movl $1,%eax # eax = 1 loop: movl 8(%ebp),%edx # edx = x result = result * x; x = x-1; .L11: if (x > 1) imull %edx,%eax # result *= x goto loop ; decl %edx # x-- cmpl $1,%edx # Compare x : 1 return result; jg .L11 # if > goto loop } movl %ebp,%esp # Finish popl %ebp # Finish Why? ret # Finish Translation? Why put the loop condition at the end? 32

  24. General “Do-While” Translation C Code Goto Version loop: do Body Body if ( Test ) while ( Test ); goto loop Body: { Statement 1 ; Statement 2 ; … Statement n ; } Test returns integer = 0 interpreted as false ≠ 0 interpreted as true 33

  25. Why? “While” Loop Translation C Code int fact_while(int x) { int result = 1; int result = 1; while (x > 1) { result = result * x; x = x-1; } result = result*x; return result; x = x-1; } int result = 1; (x > 1) ? (x > 1) ? return result; result = result*x; x = x-1; return result; 34

  26. Why? “While” Loop Translation C Code Goto Version int fact_while(int x) { int fact_while_goto(int x) { int result = 1; int result = 1; while (x > 1) { goto middle ; result = result * x; loop: x = x-1; result = result * x; } x = x-1; return result; middle: } if (x > 1) goto loop ; int result = 1; return result; } result = result*x; x = x-1; This order is used by GCC for both IA32 and x86-64 (x > 1) ? Test at end, first iteration jumps over body to test. return result; 35

  27. “While” Loop Example int fact_while(int x) { # x in %edx, result in %eax int result = 1; jmp .L34 # goto Middle while (x > 1) { .L35: # Loop: result = result * x; imull %edx, %eax # result *= x x = x - 1; decl %edx # x-- }; .L34: # Middle: return result; cmpl $1, %edx # x:1 } jg .L35 # if >, goto # Loop int result = 1; result = result*x; x = x-1; (x > 1) ? return result; 36

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend