【问题标题】:i386 vs. AMD64 ABI Differencesi386 与 AMD64 ABI 差异
【发布时间】:2011-07-30 02:49:33
【问题描述】:

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

我知道 long 类型在 i386 ABI 中是 32 位的,而在 AMD64 中是 64 位的。这是正确的吗?

【问题讨论】:

    标签: x86 abi x86-64 i386


    【解决方案1】:

    如果您需要所有 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 可以提出建议,但编译器编写者和操作系统供应商处于控制之中。

    【讨论】:

    • 所有细节最好,我在哪里可以得到这个文件?另外,有什么想法为什么它是由微软而不是由英特尔或 AMD 发布的?
    【解决方案2】:

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

    关于 32 位模式和 64 位模式的指令集的差异,Intel 和 AMD 的说明手册都应该在介绍卷或说明卷之后的卷中介绍这一点(@987654322 @,或 2 和 3 for AMD。)

    另请参阅 标签 wiki 中的其他链接。

    【讨论】:

    • @Jean-FrançoisFabre 这个答案是在 SO 转到无链接答案之前完成的;然而,更重要的是,它们之间存在很多差异,其中一些非常微妙,并且在像 Anger Fog 的作品这样经过良好修订、结构合理的文档中得到了更好的解释。
    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 2011-01-05
    • 2021-10-14
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2014-08-23
    • 2019-05-26
    相关资源
    最近更新 更多