函数返回时发生了啥

Posted

技术标签:

【中文标题】函数返回时发生了啥【英文标题】:what happened when function return函数返回时发生了什么 【发布时间】:2014-01-03 12:52:32 【问题描述】:

我知道当调用者函数调用被调用者函数时,调用者函数推送参数和返回地址,然后为被调用函数构造堆栈帧,包括push %ebp %ebx %edi %esi 和push 局部变量。但是当被调用者返回时发生了什么?

【问题讨论】:

那么,push() 操作的逆运算是什么? (请注意,您所知道的只是一种特定的调用约定,许多细节在其他环境中可能并且将会有所不同。) e,这是 C/C++ 中的默认调用约定。 @stamaimer:在 x86-32 上,即使那样我也不确定它在所有操作系统上是否完全相同。例如。 AFAIK Visual C++/x86-32 在 ECX 中传递 this,而不是 statk。 【参考方案1】:

实际上 C++ 没有标准的应用程序二进制接口 (ABI)。 C 有,但程序员可能会通过应用编译器特定的调用约定来改变它。概述(机器 x86)位于:http://en.wikipedia.org/wiki/X86_calling_conventions

【讨论】:

【参考方案2】:

被调用者将返回值保存在栈中并返回。

【讨论】:

【参考方案3】:

被调用函数执行以下任务

-> push the address of previous stack frame
-> push the local variables
-> performs computation
-> restores previous stack frame
-> store the function result
-> jump to return address

【讨论】:

以上是关于函数返回时发生了啥的主要内容,如果未能解决你的问题,请参考以下文章

这个构造函数和析构函数发生了啥?

React Hooks - 引擎盖下发生了啥?

如何判断调用函数时引用了啥? [复制]

这个函数顶部发生了啥

从 lapply 返回匿名函数 - 出了啥问题?

C++11 中的“转换构造函数”发生了啥变化? [复制]