C语言—函数栈帧

函数的调试过程—栈帧

每一次函数的调用都是一个过程,这个调用过程要为函数开辟栈空间,用于此次函数调用中变量的保存、现场保护。而这块栈空间就称为函数栈帧。
下面对函数的调用过程进行逐步的分析:

(1)首先写一个简单的加法函数,再写一个main函数进行调用,并转到汇编代码,如下图
这里写图片描述
(2)从main函数开始,先为main函数创建栈帧,过程如下
这里写图片描述
补充:esp和ebp都为寄存器;
esp存指向函数栈帧栈顶的地址
ebp存指向函数栈帧栈底的地址
下图为栈帧的创建过程
这里写图片描述
补充:main函数在_tmainCRTStartup函数中调用的,而_tmainCRTStartup函数是在mainCRTStartup被调用的。
(3)接下来是Add函数的调用
这里写图片描述
这里写图片描述
(4)到call指令按F11到这里:
这里写图片描述
再按F11进入函数:
这里写图片描述
补充:最后的ret指令会使得出栈一次,并将出栈的内容当作地址。将程序执行跳转到该地址处。
这里写图片描述
(5)最后跳回主函数,输出结果

这里写图片描述
下面是整体图:
这里写图片描述
总结:为什么函数调用要用栈来实现呢?
我们知道大部分函数顺序执行,且函数的调用是可嵌套的,而栈是一个合适的实现方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章