大会86的switch-case混乱

问题描述:

在功能switch_case,碰到问题看它时,它实现了一个跳转表VS越容易L1 :, L2:,L3:等大会86的switch-case混乱

 080483ec <switch_case>:  
    80483ec:   push %ebp 
    80483ed:   mov %esp,%ebp 
    80483ef:   sub $0x10,%esp //create stack space 
    80483f2:   mov 0x8(%ebp),%eax //param x 
    80483f5:   mov %eax,-0x4(%ebp) //x moved into -0x4(%ebp) 
    80483f8:   mov 0xc(%ebp),%eax //param n moved into %eax 
    80483fb:   sub $0x21,%eax //subtract 21 from n 
    80483fe:   cmp $0x4,%eax //compare 4 with n 
    8048401:   ja  8048420 <switch_case+0x34> // jumping to 804820 
    8048403:   mov 0x80484e0(,%eax,4),%eax 
    804840a:   jmp *%eax 
    804840c:   subl $0x2,-0x4(%ebp) 
    8048410:   jmp 8048427 <switch_case+0x3b> 
    8048412:   addl $0x2,-0x4(%ebp) 
    8048416:   jmp 8048427 <switch_case+0x3b> 
    8048418:   shll $0x3,-0x4(%ebp) 
    804841c:   addl $0x1,-0x4(%ebp) 
    8048420:   movl $0xa,-0x4(%ebp) // default starts here x=10 
    8048427:   mov -0x4(%ebp),%eax // n=x 
    804842a:   leave 
    804842b:   ret 

我的问题是:

我怎么知道哪些指令这种情况下吗?

到目前为止我理解(翻译成C):

int switch_case(int x, int n) 
    { 

    int result = x; 

    switch(n) { 

    case(): 
     x-=21; //guessing. dont think so? 
      break; 
    case(): 

      break; 
    case(): 

      break; 
    case(): 

      break; 

    default: 
    x=10; 
n=x; 

      break; 

      }//end 

    return result; 

    } 

我知道一种情况下为x + = 2;另一个是x- = 2;另一个可能是x < < 3; x ++; ,但我完全迷失在找出他们去哪里以及比较的是什么

+0

问题是? – 2015-02-06 20:59:41

+0

我不知道我明白你的意思是'我没有看到偏移的instruction'的地址 - 行打上问号跳转到0x8048420 - 一个指令程式码中清晰可见。 – 2015-02-06 21:00:41

+0

固定 - 不知道为什么我错过了 – SSOPLIF 2015-02-06 21:13:14

subtract 21是以十六进制开头的,所以这就是subtract 33十进制。另外它在使用跳转表之前发生。的逻辑是:

unsigned tmp = n - 33; 
if (tmp > 4) goto default; 
goto table[tmp]; 

这意味着,tmp可以是0 .. 3包容这又意味着用于n范围是33 .. 36。至于代码的位置,您需要查看跳转表。从地址0x80484e0开始,您将获得4个指针。