当一个函数执行完成,指令和局部变量从堆栈中移除后,返回值如何存储在内存中以供进程的主程序使用?
问问题
43 次
2 回答
1
参数如何传入,以及如何从执行的函数返回值被称为调用约定。
忽略运行时环境(Java 和 .NET,我在看你)和脚本语言(它们中的任何一个),只专注于 x86 上的本机代码,它们有很多。如果您听说过这个词cdecl
或stdcall
其他词,您可能已经遇到过它们。
通常返回值将在寄存器中返回。例如,该cdecl
约定以 EAX(对于整数和指针)或 ST0(对于浮点值)返回数据。
但是调用约定不仅仅定义了返回格式。它还定义了参数如何传递(堆栈或寄存器以及从左到右或从右到左)以及谁负责清理堆栈(即调用者或被调用者)。cdecl
例如,调用者必须清理堆栈,而stdcall
被调用者保持堆栈整洁的循环示例。
其他约定包括fastcall
和pascal
等syscall
。Wikipedia对它们都有很好的分类,Microsoft 的MSDN 说明也是如此。您可能还想查看详细的 SO 问题“ stdcall 和cdecl
cdecl ” stdcall
。
于 2013-08-23T14:19:41.573 回答
0
我认为一个正确的答案 - “这取决于”..一般它被称为“调用约定”。我认为你可以在这里找到很好的概述
请注意,此链接仅与 x86 相关,因此对于其他架构,它们可能完全不同。
于 2013-08-23T14:06:51.123 回答