Machine-Level Programming III: G G Switch Statements and IA32

Machine-Level Programming III: G G Switch Statements and IA32

Carnegie Mellon Carnegie Mellon Today Switch statements Machine‐Level Progggramming III: IA 32 Procedures . Stack Structure Switch Statements and IA32 Procedures . Calling Conventions . Illustrations of Recursion & Pointers 15‐213 / 18‐213: Introduction to Computer Systems 7th Lecture, Feb. 7th, 2012 Instructors: Todd C. Mowry & Anthony Rowe 2 Carnegie Mellon Carnegie Mellon long switch_eg Switch Statement (long x, long y, long z) Jump Table Structure { Example long w = 1; Jump Targets switch(x) { Switch Form Jump Table Targ0: case 1: switch(x) { jtab: Targ0 Code Block w = y*z; Multiple case labels case val_0: 0 Targ1 break; . Here: 5 & 6 Block 0 case 2: case val_1: Targ2 Targ1: w = y/z; Fall through cases Block 1 Code Block • 1 /* Fall Through */ . Here: 2 ••• • case 3: case val_n-1: • w += z; Missing cases Block n–1 Targ2: Targn-1 Code Block break; . Here: 4 } 2 case 5: case 6: • w -= z; Approximate Translation • break; target = JTab[x]; • default: goto *target; w = 2; } Targn-1: Code Block return w; n–1 } 3 4 1 Carnegie Mellon Carnegie Mellon Switch Statement Example (IA32) Switch Statement Example (IA32) long switch_eg(long x, long y, long z) long switch_eg(long x, long y, long z) { { long w = 1; long w = 1; switc h(x ) { switch(x) { Jump table . } .section .rodata } What range of .align 4 return w; values takes return w; .L7: } } .long .L2 # x = 0 default? .long .L3 # x = 1 .long .L4 # x = 2 Setup: Setup: .long .L5 # x = 3 .long .L2 # x = 4 switch_eg: switch_eg: .long .L6 # x = 5 pushl %ebp # Setup pushl %ebp # Setup .long .L6 # x = 6 movl %esp, %ebp # Setup movl %esp, %ebp # Setup movl 8(%ebp), %eax # %eax = x movl 8(%ebp), %eax # eax = x cmpl $6, %eax # Compare x:6 cmpl $6, %eax # Compare x:6 ja .L2 # If unsigned > goto default Indirect ja .L2 # If unsigned > goto default jmp *.L7(,%eax,4) # Goto *JTab[x] Note that w not jump jmp *.L7(,%eax,4) # Goto *JTab[x] initialized here 5 6 Carnegie Mellon Carnegie Mellon Assembly Setup Explanation Jump Table Jump table Table Structure Jump table switch(x) { . Each target requires 4 bytes .section .rodata case 1: // .L3 .section .rodata .align 4 w = y*z; . Base address at .L7 .align 4 .L7: break; .L7: .long .L2 # x = 0 .long .L2 # x = 0 .long .L3 # x = 1 case 2: // .L4 .long .L3 # x = 1 .long .L4 # x = 2 w = y/z; Jumping .long .L4 # x = 2 .long .L5 # x = 3 /* Fall Through */ . Direct: jmp .L2 .long .L5 # x = 3 .long .L2 # x = 4 case 3: // .L5 .long .L2 # x = 4 . Jump target is denoted by label .L2 .long .L6 # x = 5 w += z; .long .L6 # x = 5 .long .L6 # x = 6 break; .long .L6 # x = 6 case 5: . Indirect: jmp *.L7(,%eax,4) case 6: // .L6 . Start of jump table: .L7 w -= z; break; . Must scale by factor of 4 (labels have 32‐bits = 4 Bytes on IA32) default: // .L2 . Fetch target from effective Address .L7 + eax*4 w = 2; . Only for 0 ≤ x ≤ 6 } 7 8 2 Carnegie Mellon Carnegie Mellon Handling Fall‐Through Code Blocks (Partial) switch(x) { .L2: # Default long w = 1; case 3: case 1: // .L3 movl $2, %eax # w = 2 . w = 1; w = y*z; jmp .L8 # Goto done switch(x){) { goto merge; break; . .L5: # x == 3 case 2: case 3: // .L5 movl $1, %eax # w = 1 w = y/z; w += z; jmp .L9 # Goto merge /* Fall Through */ break; case 3: case 2: . .L3: # x == 1 w += z; w = y/z; default: // .L2 movl 16(%ebp), %eax # z break; w = 2; imull 12(%ebp), %eax # w = y*z merge: . } jjpmp .L8 # Goto done } w += z; 9 10 Carnegie Mellon Carnegie Mellon Code Blocks (Rest) Switch Code (Finish) switch(x) { .L4: # x == 2 .L8: # done: return w; . movl 12(%ebp), %edx popl %ebp case 2: // .L4 movl %edx, %eax ret w=y/z;w = y/z; sarl $31, %edx /* Fall Through */ idivl 16(%ebp) # w = y/z merge: // .L9 w += z; .L9: # merge: Noteworthy Features break; addl 16(%ebp), %eax # w += z . Jump table avoids sequencing through cases case 5: jmp .L8 # goto done . Constant time, rather than linear case 6: // .L6 w -= z; .L6: # x == 5, 6 . Use jump table to handle holes and duplicate tags break; movl $$,1, %eax # w = 1 . Use program sequencing to handle fall‐through } subl 16(%ebp), %eax # w = 1-z . Don’t initialize w = 1 unless really need it 11 12 3 Carnegie Mellon Carnegie Mellon x86‐64 Switch Implementation IA32 Object Code Same general idea, adapted to 64‐bit code Setup Table entries 64 bits (pointers) . Label .L2 becomes address 0x8048422 . Label .L7 becomes address 0x8048660 Cases use revised code Jump Table Assembly Code switch(x) { .section .rodata case 1: // .L3 .align 8 switch_eg: w = y*z; .L7: . break; .quad .L2 # x = 0 ja .L2 # If unsigned > goto default . .quad .L3 # x = 1 jmp *.L7(,%eax,4) # Goto *JTab[x] } .quad .L4 # x = 2 .quad .L5 # x = 3 .quad .L2 # x = 4 Disassembled Object Code .L3: .quad .L6 # X = 5 08048410 <switch_eg>: movq %rdx, %rax .quad .L6 # x = 6 . imulq %rsi, %rax 8048419:77 07 ja 8048422 <switch_eg+0x12> ret 804841b:ff 24 85 60 86 04 08 jmp *0x8048660(,%eax,4) 13 14 Carnegie Mellon Carnegie Mellon IA32 Object Code (cont.) IA32 Object Code (cont.) Jump Table Deciphering Jump Table . Doesn’t show up in disassembled code 0x8048660: 0x08048422 0x08048432 0x0804843b 0x08048429 . Can inspect using GDB 0x8048670: 0x08048422 0x0804844b 0x0804844b . gdb switch Address Value x . (gdb) x/7xw 0x8048660 0x8048660 0x8048422 0 . Examine 7 hexadecimal format “words” (4‐bytes each) 0x8048664 0x8048432 1 . Use command “help x” to get format documentation 0x8048668 0x804843b 2 0x804866c 0x8048429 3 0x8048660: 0x08048422 0x08048432 0x0804843b 0x08048429 0x8048670 0x8048422 4 0x8048670: 0x08048422 0x0804844b 0x0804844b 0x8048674 0x804844b 5 0x8048678 0x804844b 6 15 16 4 Carnegie Mellon Carnegie Mellon Disassembled Targets Matching Disassembled Targets 8048422: b8 02 00 00 00 mov $0x2,%eax 8048422: mov $0x2,%eax 8048427: eb 2a jmp 8048453 <switch_eg+0x43> 8048427: jmp 8048453 <switch_eg+0x43> 8048429: b8 01 00 00 00 mov $0x1,%eax 8048429: mov $0x1,%eax 804842e: 66 90 xchg %ax,%ax # noop 804842e: xchg %ax,%ax 8048430: eb 14 jjpmp 8048446 <switch_g eg+0x36> Value 8048430: jmp 8048446 <switch<switch_eg+0x36> eg+0x36> 8048432: 8b 45 10 mov 0x10(%ebp),%eax 8048432: mov 0x10(%ebp),%eax 8048435: 0f af 45 0c imul 0xc(%ebp),%eax 0x8048422 8048435: imul 0xc(%ebp),%eax 8048439: eb 18 jmp 8048453 <switch_eg+0x43> 8048439: jmp 8048453 <switch_eg+0x43> 804843b: 8b 55 0c mov 0xc(%ebp),%edx 0x8048432 804843b: mov 0xc(%ebp),%edx 804843e: 89 d0 mov %edx,%eax 0x804843b 804843e: mov %edx,%eax 8048440: c1 fa 1f sar $0x1f,%edx 8048440: sar $0x1f,%edx 8048443: f7 7d 10 idivl 0x10(%ebp) 0x8048429 8048443: idivl 0x10(%ebp) 8048446: 03 45 10 add 0x10(%ebp),%eax 8048446: add 0x10(%ebp),%eax 8048449: eb 08 jmp 8048453 <switch_eg+0x43> 0x8048422 8048449: jmp 8048453 <switch_eg+0x43> 804844b: b8 01 00 00 00 mov $0x1,%eax 804844b: mov $0x1,%eax 8048450: 2b 45 10 sub 0x10(%ebp), %eax 0x804844b 8048450: sub 0x10(%ebp),%eax 8048453: 5d pop %ebp 0x804844b 8048453: pop %ebp 8048454: c3 ret 8048454: ret 17 18 Carnegie Mellon Carnegie Mellon Summarizing Today C Control Switch statements . if‐then‐else . do‐while IA 32 Procedures . while, for . Stack Structure . switch . Calling Conventions . Illustrations of Recursion & Pointers Assembler Control . Conditional jump . Conditional move . Indirect jump . Compiler generates code sequence to implement more complex control Standard Techniques . Loops converted to do‐while form . Large switch statements use jump tables . Sparse switch statements may use decision trees 19 20 5 Carnegie Mellon Carnegie Mellon IA32 Stack IA32 Stack: Push Stack “Bottom” Stack “Bottom” Region of memory managed pushl Src with stack discipline . Fetch operand at Src IiIncreasing Increasing Grows toward lower addresses . Decrement %esp by 4 Addresses Addresses . Write operand at address given by %esp Register %esp contains lowest stack address . address of “top” element Stack Stack Grows Grows Down Down Stack Pointer: Stack Pointer: %esp %esp ‐4 Stack “Top” Stack “Top” 21 22 Carnegie Mellon Carnegie Mellon IA32 Stack: Pop Procedure Control Flow Stack “Bottom” Use stack to support procedure call and return Procedure call: call label Increasing Addresses . Push return address on stack . Jump to label Return address: . Address of the next instruction right after call . Example from disassembly Stack 804854e: e8 3d 06 00 00 call 8048b90 <main> Grows +4 Down 8048553: 50 pushl %eax Stack Pointer: %esp . Return address = 0x8048553 Procedure return: ret Stack “Top” . Pop address from stack . Jump to address 23 24 6 Carnegie Mellon Carnegie Mellon Procedure Call Example Procedure Return Example 804854e: e8 3d 06 00 00 call 8048b90 <main> 8048553: 50 pushl %eax 8048591: c3 ret call 8048b90 ret 0x110 0x110 0x110 0x110 0x10c 0x10c 0x10c 0x10c 0x108 123 0x108 123 0x108 123 0x108 123 0x104 0x8048553 0x8048553 0x104 0x8048553 %esp 0x104 %esp 0x108 %esp 0x108 %esp 0x104 %eip 0x8048591 %eip 0x8048553 %eip 0x804854e %eip 0x8048b90 %eip: program counter %eip: program counter 25 26 Carnegie Mellon Carnegie Mellon Stack‐Based Languages Call Chain Example Example Languages that support recursion yoo(…) Call Chain . e.g., C, Pascal, Java { yoo . Code must be “Reentrant” • • . Multiple simultaneous instantiations of single procedure who(…) who(); { who . Need some place to store state of each instantiation • • • • . Arguments • amI(); } amI(…) amI amI . Local variables • • • { amI(); • . Return pointer amI • • • • Stack discipline } amI(); . State for given procedure needed for limited time • amI • . From when called to when return } . Callee returns before caller does Procedure amI() is recursive Stack allocated in Frames . state for single procedure instantiation 27 28 7 Carnegie Mellon Carnegie Mellon Stack Stack Frames Example Previous yoo Contents Frame yoo(…) %ebp { .

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    17 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us