【问题标题】:How are function arguments passed in C?函数参数如何在 C 中传递?
【发布时间】:2011-09-17 01:09:11
【问题描述】:

关于 C 传递值的机制,我唯一知道的是它是通过寄存器或堆栈完成的。

注册还是堆栈?具体怎么做?

【问题讨论】:

  • 从技术上讲,这是一个实现细节,因此每个 C 编译器都可以选择传递函数参数。

标签: c arguments calling-convention


【解决方案1】:

两者兼而有之。并且约定会因平台而异。

在 x86 上,值通常通过堆栈传递。在 x64 上,首选通过寄存器传递。

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

参考x86 calling conventions

【讨论】:

  • 还应该注意的是,即使对于给定的架构,调用约定也存在差异。例如,比较cdecl(用于Linux?)和stdcall(WinAPI?)。
  • 同意。该维基百科页面的底部有一个图表,显示了不同操作系统甚至同一操作系统内的不同约定。
  • @Mystical 这是一个很好的链接——但我认为应该在答案中/旁边添加一些额外的信息。
【解决方案2】:

通常(某些编译器会按照所指出的那样执行不同的操作)对于普通函数调用,它们会在堆栈上传递。那通常是一系列推送指令,只是将数据放入堆栈。

有一些特殊情况,例如通过汇编指令和寄存器传递参数的系统调用。在硬件情况下,它们通过寄存器传递,甚至是某些中断信号,从而写入寄存器。

在具有大量寄存器的架构上,它们通常通过寄存器传递,例如某些 RISC 和 64 位架构。

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 2016-10-27
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多