函数调用机制:
首先我们看下源代码:
将a赋值为5,b赋值为3
可以看到我已经在调用函数那一行设置了断点
然后我们F5开始调试查看函数调用流程:
现在我们F11进入函数:
然后取x地址0x0012feec看下传参情况:
可以看到x和y的值已经压入栈中
传参顺序是从右往左依次入栈,所以y值在下,x值在上
然后我们继续单步走:
可以看到将参数压入栈中后紧跟着保存了返回地址,
为什么保存返回地址?这00401053是谁的地址?
当函数结束后为什么可以知道调用方的下一条指令呢?
因为发生函数调用时函数会把下一句指令的地址保存起来
当函数结束后就会返回到这个地址上继续执行调用方的代码
这个指令就是代码中main函数的return语句的地址;
为了证明这一点我刚刚悄悄看了下反汇编并且截图:
正好是00401053!
然后我们继续看:
然后看到返回地址之后又压入了0012FF48,
这个地址是调用方的栈信息也就是指向调用方栈空间的指针,
保存当前的栈信息,以便函数出去时还原到进来时状态;
现在我们解释下为什么这么多c,
原来这些都是编译器为栈申请的空间在debug版里面优化选项是默认关闭的
所以申请的局部变量空间是大于等于实际局部变量空间的;
有了优化后申请的局部变量空间会小于等于实际局部变量空间;
最后看到保存了寄存器的环境,因为之前为局部变量空间大小将
将栈顶做了调整所以将修改的寄存器保存在栈内;
以上就是基本的函数栈空间结构了;
然后这些保存完成之后就是执行函数代码了;
执行完成之后就是恢复寄存器环境释放局部空间(平衡使用的栈空间)还原到进来时期的状态,接着return返回;
跳转到刚才保存的返回地址去执行下一条指令;
本人初学 如有哪里说不对的 望提指正 !
原文:http://www.cnblogs.com/lifuqing33/p/3614490.html