Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
143,83 KB
Nội dung
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: