美文网首页
十三.函数本质之02局部变量

十三.函数本质之02局部变量

作者: mkb2 | 来源:发表于2017-05-16 23:03 被阅读20次

    当程序一启动的时候,系统分配了栈空间,然后大家都可以用,任何函数都可以使用;

    图1.我们打算用汇编编写这样的程序

    讲解:
    1.当执行第9行代码时候,先将参数压入栈3,4
    2.将下一行代码地址压入栈
    3.让bp指针指向sp这个位置
    4.sp直接减去一个数,直接往上升,开辟的空间,用来放置局部变量
    5.调用局部函数
    6.调用局部函数完毕,sp指向bp位置
    7.执行完毕整个main函数之后,sp指向原点,栈底

    局部变量在栈中

    当系统调用一个函数的时候,系统会给这个函数分配一个内存空间,用来计算使用;
    当我们执行完毕函数,不用去清理,只要操作好执行就行,将来这块空间,直接让别人来覆盖就好了;

    1.执行子函数之前,参数和地址入栈,sp指向该位置 2.bp指向sp位置 3.sp减去一个数,往上移动,开辟给局部变量的空间 4.执行完局部函数,sp指向bp位置 5.执行完毕main函数,栈平衡,不用管这些数据,放那就行,将来会有其他数据覆盖的

    bp的好处在于,上下都是很近,并且不让直接给sp赋值,所以规定使用bp
    每一次指针移动的时候,单位都是(加或者减)2
    将来会有其他数据覆盖他的


    说完了原理,我们使用汇编编写一下

    汇编编写一下逻辑 执行完毕函数,然后指针又回去了,那几个内存空间被占用了,我们不用管,将来又有其他数据占用他们的 执行汇编之前,栈顶位置和内存全是干净的

    只有递归会出现这种情况,会出现多次占用内存的情况,将来会出现栈溢出问题;
    但是正常的函数,sp调用完毕函数,就回到原点,所以没问题,即使我们多次调用这个函数,其实也是没有问题的,

    只有递归会出现这种情况

    将来问题死掉使用为找不到内存地址了,crash了

    注意:当调用函数的时候,使用到了参数,那么我们就要使用到“内平参”或者“外平参”;如果函数没有使用到参数,call和ret就可以搞定了;

    多个函数调用,查看内存空间分配情况 多个函数一起的时候,各自分配了内存空间,互不干扰

    实际上我们常说的销毁空间,并不是真的销毁,而是将这段空间置之不理,哪怕有垃圾数据也没事,将来自然有其他的数据过来搞;

    相关文章

      网友评论

          本文标题:十三.函数本质之02局部变量

          本文链接:https://www.haomeiwen.com/subject/vydrxxtx.html