C语言中函数参数如何传递?

7

我所了解的关于C语言传递值机制的唯一事情是,它通过寄存器或栈来实现。

寄存器或栈?具体怎么实现呢?


2
从技术上讲,这是一个实现细节,因此每个C编译器都可以选择以任何方式传递函数参数。 - jwodder
2个回答

6

这两种情况都有。而且惯例会因平台而异。

在x86上,通常通过堆栈传递值。在x64上,优先使用寄存器传递。

在所有情况下,如果参数太多,则必须通过堆栈传递一些参数。

请参阅x86调用约定


2
还应该注意,即使对于相同架构,调用约定也有所不同。例如,比较Linux中使用的cdecl和WinAPI中使用的stdcall - user166390
1
同意。该维基百科页面底部有一张图表,显示了不同操作系统甚至同一操作系统内的不同约定。 - Mysticial
@Mystical 这是一个不错的链接 -- 但我认为应该在答案中加入/附加一些额外的信息。 - user166390

3
通常情况下(一些编译器会有不同的做法,正如所指出的),普通函数调用是通过堆栈传递参数的。通常情况下,这是一系列推送指令,只需将数据放入堆栈中。
还有一些特殊情况,比如系统调用,参数是通过汇编指令和寄存器传递的。在硬件情况下,它们是通过寄存器甚至某些中断信号传递的,随后写入寄存器。
在具有大量寄存器的架构上,它们通常是通过寄存器传递的,例如一些RISC和64位架构。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接