当程序一启动的时候,系统分配了栈空间,然后大家都可以用,任何函数都可以使用;
讲解:
1.当执行第9行代码时候,先将参数压入栈3,4
2.将下一行代码地址压入栈
3.让bp指针指向sp这个位置
4.sp直接减去一个数,直接往上升,开辟的空间,用来放置局部变量
5.调用局部函数
6.调用局部函数完毕,sp指向bp位置
7.执行完毕整个main函数之后,sp指向原点,栈底
当系统调用一个函数的时候,系统会给这个函数分配一个内存空间,用来计算使用;
当我们执行完毕函数,不用去清理,只要操作好执行就行,将来这块空间,直接让别人来覆盖就好了;
bp的好处在于,上下都是很近,并且不让直接给sp赋值,所以规定使用bp
每一次指针移动的时候,单位都是(加或者减)2
将来会有其他数据覆盖他的
说完了原理,我们使用汇编编写一下
只有递归会出现这种情况,会出现多次占用内存的情况,将来会出现栈溢出问题;
但是正常的函数,sp调用完毕函数,就回到原点,所以没问题,即使我们多次调用这个函数,其实也是没有问题的,
将来问题死掉使用为找不到内存地址了,crash了
注意:当调用函数的时候,使用到了参数,那么我们就要使用到“内平参”或者“外平参”;如果函数没有使用到参数,call和ret就可以搞定了;
实际上我们常说的销毁空间,并不是真的销毁,而是将这段空间置之不理,哪怕有垃圾数据也没事,将来自然有其他的数据过来搞;