【发布时间】:2011-07-30 02:49:33
【问题描述】:
在哪里可以找到 i386 和 AMD64 应用程序二进制接口 (ABI) 之间数据类型的所有差异?
我知道 long 类型在 i386 ABI 中是 32 位的,而在 AMD64 中是 64 位的。这是正确的吗?
【问题讨论】:
在哪里可以找到 i386 和 AMD64 应用程序二进制接口 (ABI) 之间数据类型的所有差异?
我知道 long 类型在 i386 ABI 中是 32 位的,而在 AMD64 中是 64 位的。这是正确的吗?
【问题讨论】:
如果您需要所有 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.
编辑 2011 年 4 月 7 日回复:
此链接http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx 目前有效。没有承诺明天 MSFT 不会移动它!或谷歌“应用程序二进制接口站点:microsoft.com”
除 Windows 之外的所有 x86-64 操作系统都使用 x86-64 System V psABI。见Where is the X86-64 ABI documented?
ABI 由操作系统和编译器定义,而不是由硬件架构师定义。例如,由编译器编写者决定 C/C++ int 是 32 位,long int 是 64(x86-64 System V)——或者两者都是 32 位(x64 Windows),甚至int 是 64,long int 也是 64(正如一些 Fortran 编译器所做的那样)——甚至 int 是 64 而 long int 是 128 或您可以想象的任何其他组合。英特尔和 AMD 可以提出建议,但编译器编写者和操作系统供应商处于控制之中。
【讨论】:
我建议你下载Dr Agner Fog's optimization manuals。他有一本专门介绍 ABI 及其差异的手册。
关于 32 位模式和 64 位模式的指令集的差异,Intel 和 AMD 的说明手册都应该在介绍卷或说明卷之后的卷中介绍这一点(@987654322 @,或 2 和 3 for AMD。)
另请参阅x86 标签 wiki 中的其他链接。
【讨论】: