i386与AMD64 ABI的差异

5 x86 x86-64 abi i386

在哪里可以找到i386和AMD64应用程序二进制接口(ABI)之间数据类型的所有差异?

我知道long类型在i386 ABI中是32位,在AMD64中是64位.它是否正确?

Nec*_*lis 8

我建议你下载Dr Agner Fog的优化手册.他有一本专门关于ABI及其差异的手册.

对于32位模式和64位模式之间指令集的差异,英特尔和AMD的使用说明书应在介绍卷或指令卷后的卷中介绍(英特尔指令集参考的2a和2b,或2和3 为AMD.)

另请参阅标记wiki 中的其他链接.

  • 优秀的链接! (2认同)

Die*_*nte 6

如果您需要所有ABI 详细信息:子例程调用约定、哪些寄存器获取传入的内容、哪些寄存器必须在返回时恢复、异常处理——这是完全不同的,您可以从 Microsoft 下载适用于 Windows 的文档ABI。

另一方面,如果您只对数据类型感兴趣,则只需几分钟即可编写一个程序来执行以下操作:

fprintf (stdout, "size of int is %d\n", sizeof(int));
fprintf (stdout, "size of long int is %d\n", sizeof(long int));
// etc.
Run Code Online (Sandbox Code Playgroud)

编辑2011 年 4 月 7 日回复:

此链接http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx当前有效。不保证 MSFT 明天不会移动它!或者谷歌“应用程序二进制接口站点:microsoft.com”

除 Windows 之外的所有 x86-64 操作系统均使用 x86-64 System V psABI。请参阅X86-64 ABI 记录在哪里?

ABI 由操作系统和编译器定义,而不是由硬件架构师定义。例如,由编译器编写者决定 C/C++ int 是否是 32 位,a 是否long int是 64 位(x86-64 System V)——或者两者都是 32 位(x64 Windows),甚至 int 是64 和 long int 也是 64(正如某些 Fortran 编译器所做的那样)——甚至 int 是 64,long int 是 128 或您可以想象的任何其他组合。英特尔和 AMD 可以提出建议,但编译器编写者和操作系统供应商拥有控制权。