函数的调试过程—栈帧
每一次函数的调用都是一个过程,这个调用过程要为函数开辟栈空间,用于此次函数调用中变量的保存、现场保护。而这块栈空间就称为函数栈帧。
下面对函数的调用过程进行逐步的分析:
(1)首先写一个简单的加法函数,再写一个main函数进行调用,并转到汇编代码,如下图
(2)从main函数开始,先为main函数创建栈帧,过程如下
补充:esp和ebp都为寄存器;
esp存指向函数栈帧栈顶的地址
ebp存指向函数栈帧栈底的地址
下图为栈帧的创建过程
补充:main函数在_tmainCRTStartup函数中调用的,而_tmainCRTStartup函数是在mainCRTStartup被调用的。
(3)接下来是Add函数的调用
(4)到call指令按F11到这里:
再按F11进入函数:
补充:最后的ret指令会使得出栈一次,并将出栈的内容当作地址。将程序执行跳转到该地址处。
(5)最后跳回主函数,输出结果
下面是整体图:
总结:为什么函数调用要用栈来实现呢?
我们知道大部分函数顺序执行,且函数的调用是可嵌套的,而栈是一个合适的实现方法。