i386与AMD64 ABI的差异

时间:2011-04-05 16:03:19

标签: x86 abi x86-64 i386

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

我知道i386 ABI&中的long类型是32位。 AMD64中的64位。这是对的吗?

2 个答案:

答案 0 :(得分:8)

我建议你下载Dr Agner Fog's optimization manuals。他有一本专门关于ABI及其差异的手册。

对于32位模式和64位模式之间的指令集的差异,英特尔和AMD的说明手册应该在介绍卷或指令卷之后的卷中涵盖这一点({{ 3}},或2和3 2a and 2b for Intel's instruction set reference。)

另请参阅for AMD代码wiki中的其他链接。

答案 1 :(得分:4)

如果你需要 所有 的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.

编辑 4/7/11回复:

此链接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可以提出建议,但编译器编写者和操作系统供应商都在掌控之中。