大会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 ++; ,但我完全迷失在找出他们去哪里以及比较的是什么
答
subtract 21
是以十六进制开头的,所以这就是subtract 33
十进制。另外它在使用跳转表之前发生。的逻辑是:
unsigned tmp = n - 33;
if (tmp > 4) goto default;
goto table[tmp];
这意味着,tmp
可以是0
.. 3
包容这又意味着用于n
范围是33
.. 36
。至于代码的位置,您需要查看跳转表。从地址0x80484e0
开始,您将获得4个指针。
问题是? – 2015-02-06 20:59:41
我不知道我明白你的意思是'我没有看到偏移的instruction'的地址 - 行打上问号跳转到0x8048420 - 一个指令程式码中清晰可见。 – 2015-02-06 21:00:41
固定 - 不知道为什么我错过了 – SSOPLIF 2015-02-06 21:13:14