在计算机软件中,应用程序二进制接口( ABI ) 是两个二进制程序模块之间的接口。通常,这些模块之一是库或操作系统设施,另一个是用户正在运行的程序。
ABI定义了如何在机器代码中访问数据结构或计算例程,这是一种低级的、硬件相关的格式。相比之下,API在源代码中定义了这种访问,这是一种相对高级的、硬件无关的、通常是人类可读的格式。ABI 的一个常见方面是调用约定,它确定如何将数据作为计算例程的输入提供或作为输出读取。这方面的例子是x86 调用约定。
遵守 ABI(可能已正式标准化,也可能未正式标准化)通常是编译器、操作系统或库作者的工作。然而,应用程序程序员在用混合编程语言编写程序时,甚至在用不同的编译器编译用相同语言编写的程序时,可能不得不直接处理 ABI。
ABI 涵盖的详细信息包括以下内容:
- 处理器指令集,包括寄存器文件结构、堆栈组织、内存访问类型等细节。
- 处理器可以直接访问的基本数据类型的大小、布局和对齐方式
- 调用约定函数,它控制参数的传递方式和返回值的检索方式;例如,它控制以下内容:
- 是所有参数都在栈上传递,还是部分参数在寄存器中传递
- 哪些寄存器用于哪些函数参数
- 传入栈的第一个函数参数是先入栈还是后入栈
- 应用程序应如何对操作系统进行系统调用,如果 ABI 指定直接系统调用而不是对系统调用存根的过程调用,则系统调用号
- 在一个完整的操作系统 ABI 的情况下,目标文件、程序库等的二进制格式。