SWITCH语句(跳转表的结构)

来源:互联网 发布:台球软件 编辑:程序博客网 时间:2024/06/05 23:43

--- e:/program/test/main.cpp  -----------------------------------------------------------------------------------------------------------------------------

1:    #include <iostream>

2:    using namespace std;

3:

4:

5:    int main()

6:    {

00401600   push        ebp

00401601   mov         ebp,esp

00401603   sub         esp,54h

00401606   push        ebx

00401607   push        esi

00401608   push        edi

00401609   lea         edi,[ebp-54h]

0040160C   mov         ecx,15h

00401611   mov         eax,0CCCCCCCCh

00401616   rep stos    dword ptr [edi]

7:        int operand;

8:        int a=3, b=2;

00401618   mov         dword ptr [ebp-8],3

0040161F   mov         dword ptr [ebp-0Ch],2

9:        int result;

10:       cin>>operand;

00401626   lea         eax,[ebp-4]

00401629   push        eax

0040162A   mov         ecx,offset std::cin (00477878)

0040162F   call        @ILT+535(std::basic_istream<char,std::char_traits<char> >::operator>>) (0040121c)

11:       switch(operand)

12:       {

00401634   mov         ecx,dword ptr [ebp-4]

00401637   mov         dword ptr [ebp-14h],ecx

0040163A   cmp         dword ptr [ebp-14h],8     SWITCH语句的特征

0040163E   ja          $L7394+0Ch (004016c7)

00401644   mov         edx,dword ptr [ebp-14h]

00401647   jmp         dword ptr [edx*4+4016DAh]跳转表基地址

13:       case 0:

14:              result=a+b;

0040164E   mov         eax,dword ptr [ebp-8]

00401651   add         eax,dword ptr [ebp-0Ch]

00401654   mov         dword ptr [ebp-10h],eax

15:              break;

00401657   jmp         $L7394+0Ch (004016c7)

16:       case 1:

17:               result=2*a+b;

00401659   mov         ecx,dword ptr [ebp-8]

0040165C   mov         edx,dword ptr [ebp-0Ch]

0040165F   lea         eax,[edx+ecx*2]

00401662   mov         dword ptr [ebp-10h],eax

18:               break;

00401665   jmp         $L7394+0Ch (004016c7)

19:       case 2:

20:                result=3*a+b;

00401667   mov         ecx,dword ptr [ebp-8]

0040166A   imul        ecx,ecx,3

0040166D   add         ecx,dword ptr [ebp-0Ch]

00401670   mov         dword ptr [ebp-10h],ecx

21:                break;

00401673   jmp         $L7394+0Ch (004016c7)

22:       case 3:

23:                result=4*a+b;

00401675   mov         edx,dword ptr [ebp-8]

00401678   mov         eax,dword ptr [ebp-0Ch]

0040167B   lea         ecx,[eax+edx*4]

0040167E   mov         dword ptr [ebp-10h],ecx

24:                break;

00401681   jmp         $L7394+0Ch (004016c7)

25:       case 4:

26:                result=5*a+b;

00401683   mov         edx,dword ptr [ebp-8]

00401686   imul        edx,edx,5

00401689   add         edx,dword ptr [ebp-0Ch]

0040168C   mov         dword ptr [ebp-10h],edx

27:                break;

0040168F   jmp         $L7394+0Ch (004016c7)

28:       case 5:

29:                result=6*a+b;

00401691   mov         eax,dword ptr [ebp-8]

00401694   imul        eax,eax,6

00401697   add         eax,dword ptr [ebp-0Ch]

0040169A   mov         dword ptr [ebp-10h],eax

30:                break;

0040169D   jmp         $L7394+0Ch (004016c7)

31:       case 6:

32:                result=7*a+b;

0040169F   mov         ecx,dword ptr [ebp-8]

004016A2   imul        ecx,ecx,7

004016A5   add         ecx,dword ptr [ebp-0Ch]

004016A8   mov         dword ptr [ebp-10h],ecx

33:                break;

004016AB   jmp         $L7394+0Ch (004016c7)

34:       case 7:

35:                result=8*a+b;

004016AD   mov         edx,dword ptr [ebp-8]

004016B0   mov         eax,dword ptr [ebp-0Ch]

004016B3   lea         ecx,[eax+edx*8]

004016B6   mov         dword ptr [ebp-10h],ecx

36:                break;

004016B9   jmp         $L7394+0Ch (004016c7)

37:       case 8:

38:                result=9*a+b;

004016BB   mov         edx,dword ptr [ebp-8]

004016BE   imul        edx,edx,9

004016C1   add         edx,dword ptr [ebp-0Ch]

004016C4   mov         dword ptr [ebp-10h],edx

39:                break;

40:       default:

41:

42:                break;

43:

44:       }

45:

46:       return 0;

004016C7   xor         eax,eax

47:   }

004016C9   pop         edi

004016CA   pop         esi

004016CB   pop         ebx

004016CC   add         esp,54h

004016CF   cmp         ebp,esp

004016D1   call        __chkesp (00420cd0)

004016D6   mov         esp,ebp

004016D8   pop         ebp

004016D9   ret

004016DA   dec         esi

004016DB   push        ss

004016DC   inc         eax

004016DD   add         byte ptr [ecx+16h],bl

004016E0   inc         eax

004016E1   add         byte ptr [edi+16h],ah

004016E4   inc         eax

004016E5   add         byte ptr [ebp+16h],dh

004016E8   inc         eax

004016E9   add         byte ptr [ebx-6EFFBFEAh],al

004016EF   push        ss

004016F0   inc         eax

004016F1   add         byte ptr [edi-52FFBFEAh],bl

004016F7   push        ss

004016F8   inc         eax

004016F9   add         byte ptr [ebx-33FFBFEAh],bh

--- No source file  ----------------------------------

 

 

 

 

内存跳转表数据

004016DA  4E 16 40 00 59 16 40 00 67 16 40 00 75 16 40 00  N.@.Y.@.g.@.u.@.

004016EA  83 16 40 00 91 16 40 00 9F 16 40 00 AD 16 40 00  ..@...@...@...@.

004016FA  BB 16 40 00 CC CC CC CC CC CC CC CC CC CC CC CC