首页 > 解决方案 > 遵循 ABI 进行模块本地调用的目的是什么?它甚至在哪里执行?

问题描述

我知道 ABI 是一种非语言特定的构造,它定义了诸如数据从一个函数传递到另一个函数的方式。遵守此类 ABI 是编译器的工作。我也了解 ABI 如何对模块间调用有用,例如,调用 .dll,就好像我们没有明确定义的调用约定一样,就没有可靠的方法来传递数据.

我迷路的地方是没有外部引用的函数的目的。编译器不能为每个函数创建自己的任意调用约定吗?我已经看到编译器产生了对现有调用约定的奇怪修改版本。为了进一步混淆,x64 调用约定的官方文档通常使用非常严格的语言,例如:

函数调用的参数和用于这些参数的寄存器之间存在严格的一一对应关系。

然而,至少在 __thiscall 等 x8​​6 调用约定中,我已经看到编译器在没有外部引用的函数中违反了它们的约定。那么,为什么这些约定甚至存在于没有外部引用的函数中,如果在这种情况下违反它们会发生什么?

标签: assemblyx86compiler-constructionx86-64abi

解决方案


对于没有外部引用的函数,编译器没有严格的要求遵循 ABI,它可以自由选择,但违反 ABI 的收益通常是微不足道的,这使得优化不值得努力实现。


推荐阅读