【发布时间】:2011-09-17 01:09:11
【问题描述】:
关于 C 传递值的机制,我唯一知道的是它是通过寄存器或堆栈完成的。
注册还是堆栈?具体怎么做?
【问题讨论】:
-
从技术上讲,这是一个实现细节,因此每个 C 编译器都可以选择传递函数参数。
标签: c arguments calling-convention
关于 C 传递值的机制,我唯一知道的是它是通过寄存器或堆栈完成的。
注册还是堆栈?具体怎么做?
【问题讨论】:
标签: c arguments calling-convention
两者兼而有之。并且约定会因平台而异。
在 x86 上,值通常通过堆栈传递。在 x64 上,首选通过寄存器传递。
在所有情况下,如果参数过多,则必须通过堆栈传递一些参数。
【讨论】:
cdecl(用于Linux?)和stdcall(WinAPI?)。
通常(某些编译器会按照所指出的那样执行不同的操作)对于普通函数调用,它们会在堆栈上传递。那通常是一系列推送指令,只是将数据放入堆栈。
有一些特殊情况,例如通过汇编指令和寄存器传递参数的系统调用。在硬件情况下,它们通过寄存器传递,甚至是某些中断信号,从而写入寄存器。
在具有大量寄存器的架构上,它们通常通过寄存器传递,例如某些 RISC 和 64 位架构。
【讨论】: