本文主要是介绍C语言函数栈桢理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、宏观背景
当执行一个程序后,实质就是启动一个进程,OS创建该进程对应的PCB对其进行管理,其中就包括空间分配。各个区域(堆区、栈区、代码区等)可用空间大小OS自动分配,当进程跑起来就会根据代码在堆区栈区划分空间,而运行中维护当前栈区的两个寄存器就是栈顶指针ebp和栈底指针esp,寄存器里面存放当前使用的栈空间边界地址(栈区使用习惯是从高地址到低地址)。
二、具体流程(只研究esp和ebp)
1、main函数内,ebp指向A,esp指向B,在维护的空间内创建临时变量,地址一般从高往低分配,实际读变量值的时候用的是该变量的低地址,然后往高地址加上步长-1就是该变量的存放空间,再根据大端(高位存低地址)或小端(低位存低地址) 就能读出里面变量的值;
2、当调用ADD函数的时候,会先把两个实参先拷贝(先右后左)给寄存器并入栈(这就是所谓形参,所以形参是实参的临时拷贝),再把ADD函数执行完下条指令的地址入栈,再把main函数的ebp值入栈,然后esp赋值给ebp,ebp指向G处,esp扩张栈空间指向H处,一顿操作后再把栈空间初始化(一般0xcccccccc);
3、计算结束后会把结果存在寄存器里面(如eax)到时候给c变量,同时esp指向ebp的位置G(此时ADD的栈桢销毁),再将FG之间ebp之前的值弹出给ebp,ebp就知道了最初的位置A,回指到A,最后弹出call(调用ADD)指令下一条指令的地址,然后销毁ecx、eax的栈桢,最后继续原来main内的操作。
注:每次push到当前维护栈顶之上,esp就会自动上移(往更低地址走)。
这篇关于C语言函数栈桢理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!