在哪里可以找到 i386 和 AMD64 应用程序二进制接口 (ABI) 之间数据类型的所有差异?
我知道 long 类型在 i386 ABI 中是 32 位,在 AMD64 中是 64 位。它是否正确?
我建议你下载Dr Agner Fog 的优化手册。他有一本专门关于 ABI 及其差异的手册。
For differences in the instruction set between 32-bit mode and 64-bit mode, both Intel and AMD's instruction manuals should cover this in the introductory volume or the volumes after the instruction volumes(2a and 2b for Intel's instruction set reference, or 2 and 3 for AMD.)
See also other links in the x86 tag wiki.
如果您需要所有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。请参阅X86-64 ABI 记录在哪里?
ABI 由操作系统和编译器定义,而不是硬件架构师。例如,由编译器编写者决定 C/C++ int 是 32 位而 along int
是 64 位(x86-64 System V) - 还是两者都是 32 位(x64 Windows),甚至一个 int 是64 和 long int 也是 64(正如一些 Fortran 编译器所做的那样)——甚至 int 是 64 而 long int 是 128 或您可以想象的任何其他组合。英特尔和 AMD 可以提出建议,但编译器编写者和操作系统供应商在控制之中。