我想知道哪一个负责堆栈的清理

假设你有一个 fun 函数,可以这样说:

var = fun(int x, int y, float z, char x);

什么时候 fun 将被调用,它将与参数一起进入堆栈,然后当函数返回时,谁负责清理堆栈,是函数本身还是保存返回值的“var”。

还有一件事,任何人都可以解释调用约定的概念吗?

有帮助吗?

解决方案

调用约定 指谁在进行堆栈清理;呼叫者或被呼叫者。

调用约定可能有所不同:

  • 参数和返回值放置的位置(在寄存器中;在通话堆上;两者的混合)
  • 传递参数的顺序(或单个参数的一部分)
  • 设置和清理函数调用的任务如何在呼叫者和Callee之间进行分配。
  • Callee可能直接使用的哪些寄存器有时也可能包括在内

架构几乎总是有一个不止一个可能的呼叫惯例。

其他提示

您自己引用了答案: 调用约定.

调用约定类似于 合同. 。它决定以下几件事:

  • 谁负责清理参数。
  • 参数如何以及以何种顺序传递给被调用函数。
  • 返回值存储的位置。

根据平台和编程环境的不同,有许多不同的调用约定。x86 平台上的两种常见调用约定是:

标准调用

参数从右到左传递到堆栈上。这 被称为 函数清理堆栈。

cdecl

参数从右到左传递到堆栈上。这 呼叫 函数清理堆栈。

在这两种情况下,返回值都在 EAX 注册(或 ST0 对于浮点值)

x86 平台的许多编程语言都允许指定调用约定,例如:

德尔福

function MyFunc(x: Integer): Integer; stdcall;

微软C/C++

int __stdcall myFunc(int x)

一些使用注意事项:

创建简单的应用程序时,很少需要更改或了解调用约定,但有两种典型情况需要您关注调用约定:

  • 调用外部库时,Win32 API例如:您必须使用兼容的调用约定,否则堆栈可能会损坏。
  • 创建内联汇编代码时:您必须知道在哪些寄存器以及堆栈中的哪个位置可以找到变量。

有关更多详细信息,我推荐这些维基百科文章:

通过将时间线是完整的变种将保持由乐趣()使用由乐趣返回的值和在堆栈上的任何存储器将会消失:“推”,“流行”所有整齐

调用约定:家居编译器组织,这样的乐趣可以做其工作。考虑这些参数X,Y,Z。为了什么?他们被推到堆栈(实际上他们得到通过堆栈传递)?不要紧,只要主叫方和被叫方同意!这是一个约定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top