0

当一个函数执行完成,指令和局部变量从堆栈中移除后,返回值如何存储在内存中以供进程的主程序使用?

4

2 回答 2

1

参数如何传入,以及如何从执行的函数返回值被称为调用约定

忽略运行时环境(Java 和 .NET,我在看你)和脚本语言(它们中的任何一个),只专注于 x86 上的本机代码,它们有很多。如果您听说过这个词cdeclstdcall其他词,您可能已经遇到过它们。

通常返回值将在寄存器中返回。例如,该cdecl约定以 EAX(对于整数和指针)或 ST0(对于浮点值)返回数据。

但是调用约定不仅仅定义了返回格式。它还定义了参数如何传递(堆栈或寄存器以及从左到右或从右到左)以及谁负责清理堆栈(即调用者或被调用者)。cdecl例如,调用者必须清理堆栈,而stdcall被调用者保持堆栈整洁的循环示例。

其他约定包括fastcallpascalsyscall。Wikipedia对它们都有很好的分类,Microsoft 的MSDN 说明也是如此。您可能还想查看详细的 SO 问题“ stdcall 和cdeclcdecl ” stdcall

于 2013-08-23T14:19:41.573 回答
0

我认为一个正确的答案 - “这取决于”..一般它被称为“调用约定”。我认为你可以在这里找到很好的概述

请注意,此链接仅与 x86 相关,因此对于其他架构,它们可能完全不同。

于 2013-08-23T14:06:51.123 回答