您的位置 首页 厂商

汇编技能内情(3)

局部变量的栈分配下面我们分析一下C编译器如何处理局部变量的分配,为此先给出如下程序:vitest2cintmain(){inti;int

局部变量栈分配
下面咱们剖析一下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) ; i++
main+0x23: movl -8(%ebp),%eax ; 将j的值装入EAX
main+0x26: addl -4(%ebp),%eax ; i+j并将成果存入EAX,作为回来值
main+0x29: leave ; 吊销Stack Frame
main+0x2a: ret ; main函数回来
>
经过mdb对程序运转时的寄存器和栈的调查和剖析,能够得出局部变量在栈中的拜访和分配及开释方法:
1.局部变量的分配,能够经过esp减去所需字节数
subl $8,%esp
2.局部变量的开释,能够经过leave指令
leave
3.局部变量的拜访,能够经过ebp减去偏移量
movl -8(%ebp),%eax
addl -4(%ebp),%eax
问题:当存在2个以上的局部变量时,怎么进行栈对齐?
在上篇文章中,说到subl $8,%esp句子除了分配栈空间外,还有一个效果便是栈对齐。那么本例中,因为i和j正好是8字节,那么假如存在2个以上的局部变量时,怎么一起满意空间分配和栈对齐呢?

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/260218.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部