07 switch statements 09 44 tủ tài liệu bách khoa

14 44 0
07 switch statements 09 44 tủ tài liệu bách khoa

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

University  of  Washington   long switch_eg (unsigned long x, long y, long z) { long w = 1; switch(x) { case 1: w = y*z; break; case 2: w = y/z; /* Fall Through */ case 3: w += z; break; case 5: case 6: w -= z; break; default: w = 2; } return w; } Switch  Statement   Example  Mul;ple case labels Đ Here: 5,  Fall through cases Đ Here:  Missing cases Đ Here:  x86   Lots  to  manage,  we   need  a  jump  table   University  of  Washington   Jump  Table  Structure   switch(x) { case val_0: Block  0   case val_1: Block  1   • • •   case val_n-1: Block  n–1 } Jump  Targets   Jump  Table   Switch  Form   JTab: Targ0 Targ0: Code  Block     Targ1: Code  Block     Targ2: Code  Block     Targ1 Targ2 • • • Targn-1 • • • Approximate  Transla;on   target = JTab[x]; goto *target; Targn-1: x86   Code  Block   n–1   University  of  Washington   Jump  Table  Structure   Memory   C  code:   switch(x) { case 1: break; case 2: case 3: break; case 5: case 6: break; default: } Code   Blocks   We  can  use  the  jump  table  when  x   goto default goto JTab[x] x x x x x x x = = = = = = = University  of  Washington   Assembly  Setup  Explana;on   ¢  Table  Structure   Jump  table   §  Each  target  requires  4  bytes   §  Base  address  at  .L62   ¢  Jumping:  different  address  modes   for  target   Direct: jmp L61 §  Jump  target  is  denoted  by  label  .L61 section rodata align L62: long L61 # long L56 # long L57 # long L58 # long L61 # long L60 # long L60 # x x x x x x x = = = = = = = Indirect: jmp *.L62(,%edx,4) §  Start  of  jump  table:  .L62 §  Must  scale  by  factor  of  4  (labels  are  32-­‐bits  =  4  bytes  on  IA32)   §  Fetch  target  from  effecLve  address  .L62 + edx*4 §  target = JTab[x]; goto *target;  (only  for    0  ≤  x  ≤  6)   x86   University  of  Washington   Code  Blocks  (Par;al)   switch(x) { case 2: // L57 w = y/z; /* Fall Through */ case 3: // L58 w += z; break; default: // L61 w = 2; } L61: // Default case movl $2, %ebx # w = movl %ebx, %eax # Return w popl %ebx leave ret L57: // Case 2: movl 12(%ebp), %eax # y cltd # Div prep idivl %ecx # y/z movl %eax, %ebx # w = y/z # Fall through L58: // Case 3: addl %ecx, %ebx # w+= z movl %ebx, %eax # Return w popl %ebx leave ret x86   University  of  Washington   Code  Blocks  (Rest)   switch(x) { case 1: // L56 w = y*z; break; case 5: case 6: // L60 w -= z; break; } L60: // subl movl popl leave ret L56: // movl imull movl popl leave ret x86   Cases 5&6: %ecx, %ebx # w –= z %ebx, %eax # Return w %ebx Case 1: 12(%ebp), %ebx # w = y %ecx, %ebx # w*= z %ebx, %eax # Return w %ebx University  of  Washington   IA32  Object  Code   ¢  Setup   §  Label  .L61  becomes  address  0x08048630   §  Label  .L62  becomes  address  0x080488dc Assembly  Code   switch_eg: ja L61 # if > goto default jmp *.L62(,%edx,4) # goto JTab[x] Disassembled  Object  Code   08048610 : 08048622: 77 0c 08048624: ff 24 95 dc 88 04 08 x86   ja jmp 8048630 *0x80488dc(,%edx,4) University  of  Washington   IA32  Object  Code  (cont.)   ¢  Jump  Table   §  Doesn’t  show  up  in  disassembled  code   §  Can  inspect  using  GDB   gdb asm-cntl (gdb) x/7xw 0x080488dc §  Examine  7  hexadecimal  format  “words”  (4-­‐bytes  each)   §  Use  command  “help x”  to  get  format  documentaLon   0x080488dc: 0x08048630 0x08048650 0x0804863a 0x08048642 0x08048630 0x08048649 0x08048649 x86   University  of  Washington   Disassembled  Targets   8048630: 8048635: 8048637: 8048638: 8048639: 804863a: 804863d: 804863e: 8048640: 8048642: 8048644: 8048646: 8048647: 8048648: 8048649: 804864b: 804864d: 804864e: 804864f: 8048650: 8048653: 8048656: 8048658: 8048659: 804865a: bb 89 5b c9 c3 8b 99 f7 89 01 89 5b c9 c3 29 89 5b c9 c3 8b 0f 89 5b c9 c3 02 00 00 00 d8 mov mov pop leave ret mov cltd idiv mov add mov pop leave ret sub mov pop leave ret mov imul mov pop leave ret 45 0c f9 c3 cb d8 cb d8 5d 0c af d9 d8 x86   $0x2,%ebx %ebx,%eax %ebx 0xc(%ebp),%eax %ecx %eax,%ebx %ecx,%ebx %ebx,%eax %ebx %ecx,%ebx %ebx,%eax %ebx 0xc(%ebp),%ebx %ecx,%ebx %ebx,%eax %ebx University  of  Washington   Matching  Disassembled  Targets   0x08048630 0x08048650 0x0804863a 0x08048642 0x08048630 0x08048649 0x08048649 8048630: 8048635: 8048637: 8048638: 8048639: 804863a: 804863d: 804863e: 8048640: 8048642: 8048644: 8048646: 8048647: 8048648: 8048649: 804864b: 804864d: 804864e: 804864f: 8048650: 8048653: 8048656: 8048658: 8048659: 804865a: x86   bb 89 5b c9 c3 8b 99 f7 89 01 89 5b c9 c3 29 89 5b c9 c3 8b 0f 89 5b c9 c3 02 00 00 00 d8 45 0c f9 c3 cb d8 cb d8 5d 0c af d9 d8 mov mov pop leave ret mov cltd idiv mov add mov pop leave ret sub mov pop leave ret mov imul mov pop leave ret University  of  Washington   Ques;on   ¢  Would  you  implement  this  with  a  jump  table?   switch(x) { case 0: break; case 10: break; case 52000: break; default: break; } ¢  Probably  not:   §  Don’t  want  a  jump  table  with  52001  entries  (too  big)   x86   ... University  of  Washington   Switch  Statement  Example  (IA32)   long switch_ eg(unsigned long x, long y, long z) { long w = 1; switch( x) { } return w; } Setup:   switch_ eg: pushl %ebp movl... University  of  Washington   Switch  Statement  Example  (IA32)   long switch_ eg(unsigned long x, long y, long z) { long w = 1; switch( x) { } return w; } Setup:   switch_ eg: pushl %ebp movl...  Washington   Jump  Table  Structure   switch( x) { case val_0: Block  0   case val_1: Block  1   • • •   case val_n-1: Block  n–1 } Jump  Targets   Jump  Table   Switch  Form   JTab: Targ0 Targ0:

Ngày đăng: 09/11/2019, 06:44

Tài liệu cùng người dùng

Tài liệu liên quan