首页 > 其他 > 详细

函数调用机制(栈结构)

时间:2014-03-21 06:07:12      阅读:661      评论:0      收藏:0      [点我收藏+]

函数调用机制:

首先我们看下源代码:

bubuko.com,布布扣

a赋值为5b赋值为3

可以看到我已经在调用函数那一行设置了断点

然后我们F5开始调试查看函数调用流程:bubuko.com,布布扣

现在我们F11进入函数:

然后取x地址0x0012feec看下传参情况:

bubuko.com,布布扣

可以看到xy的值已经压入栈中

传参顺序是从右往左依次入栈,所以y值在下,x值在上

然后我们继续单步走:

 bubuko.com,布布扣

可以看到将参数压入栈中后紧跟着保存了返回地址,

为什么保存返回地址?00401053是谁的地址?

 

当函数结束后为什么可以知道调用方的下一条指令呢?

 

因为发生函数调用时函数会把下一句指令的地址保存起来

 

当函数结束后就会返回到这个地址上继续执行调用方的代码

 

这个指令就是代码中main函数的return语句的地址;

 

为了证明这一点我刚刚悄悄看了下反汇编并且截图:

 

bubuko.com,布布扣

 

正好是00401053

然后我们继续看:

bubuko.com,布布扣

然后看到返回地址之后又压入了0012FF48

这个地址是调用方的栈信息也就是指向调用方栈空间的指针,

保存当前的栈信息,以便函数出去时还原到进来时状态;

bubuko.com,布布扣

现在我们解释下为什么这么多c,

原来这些都是编译器为栈申请的空间在debug版里面优化选项是默认关闭的

所以申请的局部变量空间是大于等于实际局部变量空间的;

有了优化后申请的局部变量空间会小于等于实际局部变量空间;

bubuko.com,布布扣

最后看到保存了寄存器的环境,因为之前为局部变量空间大小将

将栈顶做了调整所以将修改的寄存器保存在栈内;

以上就是基本的函数栈空间结构了;

然后这些保存完成之后就是执行函数代码了;

执行完成之后就是恢复寄存器环境释放局部空间(平衡使用的栈空间)还原到进来时期的状态,接着return返回;

跳转到刚才保存的返回地址去执行下一条指令;

bubuko.com,布布扣

 

 

本人初学 如有哪里说不对的 望提指正 !

函数调用机制(栈结构),布布扣,bubuko.com

函数调用机制(栈结构)

原文:http://www.cnblogs.com/lifuqing33/p/3614490.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!