当函数的执行完成,并且指令和局部变量从堆栈中删除时,返回值如何存储在内存中以供进程的主程序使用?
答案 0 :(得分:1)
如何传入参数以及从已执行函数返回的值称为调用约定。
忽略运行时环境(Java和.NET,我正在看你)和脚本语言(其中任何一种)并纯粹在x86上的本机代码中进行概念,其中有很多。如果你曾经听过cdecl
或stdcall
这个词,你可能会碰到它们。
通常,返回值将在寄存器中返回。例如,cdecl
约定以EAX(对于整数和指针)或ST0(对于浮点值)返回数据。
但是调用约定不仅仅定义了返回格式。它还定义了如何传递参数(堆栈,或寄存器以及从左到右或从右到左)以及谁负责清理堆栈(即调用者或被调用者)。例如cdecl
是调用者必须清理堆栈的对象的示例,而stdcall
被调用者保持堆栈整洁。
其他约定包括fastcall
,pascal
和syscall
等。维基百科有good breakdown on them all,微软的MSDN notes也是如此。您可能还想查看详情为cdecl
和stdcall
的问题“stdcall and cdecl”。
答案 1 :(得分:0)
我认为一个正确的答案 - “这取决于”......一般来说,它被称为“呼叫约定”。 我认为非常好的概述你可以找到here
请注意此链接仅与x86相关,因此对于其他体系结构,它们可能完全不同。