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

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

十三.函数本质之02局部变量_第1张图片
图1.我们打算用汇编编写这样的程序

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

十三.函数本质之02局部变量_第2张图片
局部变量在栈中

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

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

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


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

十三.函数本质之02局部变量_第8张图片
汇编编写一下逻辑
十三.函数本质之02局部变量_第9张图片
执行完毕函数,然后指针又回去了,那几个内存空间被占用了,我们不用管,将来又有其他数据占用他们的
十三.函数本质之02局部变量_第10张图片
执行汇编之前,栈顶位置和内存全是干净的

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

十三.函数本质之02局部变量_第11张图片
只有递归会出现这种情况

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

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

十三.函数本质之02局部变量_第12张图片
多个函数调用,查看内存空间分配情况
十三.函数本质之02局部变量_第13张图片
多个函数一起的时候,各自分配了内存空间,互不干扰

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

你可能感兴趣的:(十三.函数本质之02局部变量)