反汇编一个函数?
今天在linux下对一个函数进行了反汇编(基于AT&T)
C语言函数原型:
int bar(int c, int d)
{
int e = c + d;
return e;
}
反汇编结果:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 10 sub $0x10,%esp //问题
6: 8b 45 0c mov 0xc(%ebp),%eax
9: 03 45 08 add 0x8(%ebp),%eax
c: 89 45 fc mov %eax,0xfffffffc(%ebp)
f: 8b 45 0c mov 0xc(%ebp),%eax
12: 03 45 08 add 0x8(%ebp),%eax
15: c9 leave
16: c3 ret
我就是不明白函数中明明只有一个局部变量e,为什么要sub $0x10,%esp ,不是只要减4字节就够了吗?如果可以能解释一下吗?
[解决办法]
现实中的编译器不是向你想得那样,如果我们用汇编来写你那段函数,当然可以
做到用多少就分多少的精确手术。但是编译器往往由于其他原因会多分配local变量
或多增加指令,比如:检查堆栈overflow,调试,捕获非法读写vals,指令乱序,
优化,将耗时操作简化,将循环打散等。