assembly - 为什么有这么多不同的调用约定?

标签 assembly history low-level calling-convention

从历史上看,为什么似乎每个人和他们的弟弟都定义了自己的称呼习惯?你有 C、C++、Windows、Pascal、Fortran、Fastcall 以及可能还有无数其他我没想到的。对于绝大多数用例来说,一种约定不应该是最有效的吗?有什么好的理由更喜欢一个吗?

最佳答案

您提到的调用约定是在数十年来为不同语言和不同硬件设计的。他们都有不同的目标。 cdecl 支持 printf 的可变参数。 stdcall 导致更小的代码生成,但没有可变参数。 Fastcall 可以大大加快在旧机器上只有一两个参数的简单函数的性能(但今天很少有加速。)

请注意,当 x64 被引入时,至少在 Windows 上,它被设计为具有单一的调用约定。

Raymond Chen 在调用约定的历史上写了一个很棒的系列,您可以开始 here .

关于assembly - 为什么有这么多不同的调用约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3428332/

相关文章:

assembly - 是否有可能通过软件永久损坏硬件?

.net - 使用 ClickOnce .NET 应用程序显示修订历史记录的机制

java - Permgen 空间增量填充/调整大小。如何微调避免调整其大小

assembly - 如何创建不可重定位符号

c - sys_schedule() 在 Minix 3.1.8 中做什么?

linux - Unix shell 目录历史

c++ - 使用巨大的 Valgrind 和低级 C++ API

c - 内联汇编程序 : What scratch registers can be used?

assembly - 在 8086 中通过 TASM 使用 Pusha 和 Popa

linux - 如何在不记录历史记录的情况下在 bash 中执行命令?