局部变量的栈分配
下面我们分析一下C编译器如何处理局部变量的分配,为此先给出如下程序:
#vi test2.c
int main()
{
int i;
int j=2;
i=3;
i=++i;
return i+j;
}
编译该程序,产生二进制文件,并利用mdb来观察程序运行中的stack的状态:
#gcc test2.c -o test2
#mdb test2
Loading modules: [ libc.so.1 ]
> main::dis
main: pushl %ebp
main+1: movl %esp,%ebp ; main至main+1,创建Stack Frame
main+3: subl $8,%esp ; 为局部变量i,j分配栈空间,并保证栈16字节对齐
main+6: andl $0xf0,%esp
main+9: movl $0,%eax
main+0xe: subl %eax,%esp ; main+6至main+0xe,再次保证栈16字节对齐
main+0x10: movl $2,-8(%ebp) ; 初始化局部变量j的值为2
main+0x17: movl $3,-4(%ebp) ; 给局部变量i赋值为3
main+0x1e: leal -4(%ebp),%eax ; 将局部变量i的地址装入到EAX寄存器中
main+0x21: incl (%eax)