C调用约定的替代方案?好资源?优点缺点?

时间:2012-04-02 17:37:56

标签: language-agnostic assembly calling-convention

我此时真的只熟悉C调用约定(如Nasm - C calling convention所述)。这个源代码也描述了Pascal样式调用约定。

我想了解那里的各种函数调用约定(描述或来源)?使用一个优于另一个(如果有的话)的优点和缺点是什么?

注意:最感兴趣的是x86平台,但欢迎您描述其他人。

1 个答案:

答案 0 :(得分:2)

C调用约定的最大优点是:

  1. 处理varargs。使用C调用约定,调用者推入堆栈并起飞 - 调用者知道他们传递了多少个参数,因为他们正在进行传递。否则被调用者必须以某种方式解决它。当然,如果他们想要使用 varargs,他们会这样做,但是如果他们弄错了,为什么还要给他们粉碎堆栈的机会呢?因此,具有被调用者清理的语言往往不支持varargs。
  2. 您的代码与C(和大多数C ++)链接兼容。你没有听说过glibpascal,对吗?不这么认为。
  3. 基于寄存器的调用也很有用,我认为很多C编译器都会这样做来优化而不是将整数/指针推到堆栈上 - 当然不是库中的外部可见函数!

    关于惯例的重点是它们是传统的。遵循惯例是有道理的,因为那些遵守惯例的人知道会发生什么。所以真的,不要过度思考它。在这种情况下,跟随人群会产生实实在在的好处。