64 位应用程序使用可执行和链接格式 (Executable and Linking Format, ELF64) 进行描述,使用该格式可以全面地描述大型应用程序和较大地址空间。
以下列出了 AMD ABI 的特征:
AMD ABI 允许充分利用所有的 64 位指令和 64 位寄存器。许多新指令都是对现有 i386 指令集的直接扩展。目前,共有十六个通用寄存器:
七个通用寄存器(%rdi、%rsi、%rdx、%rcx、%r8、%r9 和 %rax)在函数调用序列中具有明确定义的角色,该序列现在用于在寄存器中传递参数。 |
两个寄存器(%rsp 和 %rbp)用于管理栈。 |
两个寄存器(%r10 和 %r11)是临时寄存器。 |
五个寄存器(%r12、%r13、%r14、%r15 和 %rbx)由被调用方保存。 |
对于 AMD ABI,基本函数调用的约定不同。参数会放在寄存器中。对于简单的整数参数,前几个参数依次放在 %rdi、%rsi、%rdx、%rcx、%r8 和 %r9 寄存器中。
对于 AMD,栈的布局稍有不同。具体来说,栈在紧靠调用指令的前面始终以 16 个字节为边界对齐。
指令大小仍为 32 位。因此,生成地址常量需要更多指令。由于调用指令只能到达从 %rip 加/减 2 GB 的范围,因此无法再将其用于在地址空间中的任何位置建立分支。
现在,整数乘除函数可以完全在硬件中实现。
结构的传递和返回以不同的方式实现。小型数据结构和某些浮点参数现在直接在寄存器中传递。
使用新的 PC 相关寻址模式,可以生成更高效的位置无关代码。
所有数据类型现在都与其长度对齐。
许多基本派生类型会更长,因此,许多系统调用接口数据结构现在具有不同的长度。
系统中存在两组不同的库:一种用于 32 位 i386 应用程序的库,另一种用于 64 位 amd64 应用程序的库。
AMD ABI 极大地增强了浮点功能。
通过 64 位 ABI,可以使用所有使用 x87 浮点寄存器(%fpr0 至 %fpr7,%mm0 至 %mm7)的 x87 和 MMX 指令。 |
此外,还可以使用那些使用 128 位 XMM 寄存器(%xmm0 至 %xmm15)完整 SSE 和 SSE2 指令集。 |
请参见 amd64 psABI 草案文档《System V Application Binary Interface, AMD64 Architecture Processor Supplement》(草案版本 0.92)。
对于 64 位应用程序,尽管起始地址和寻址限制大不相同,但地址空间的布局与 32 位应用程序的布局密切相关。与 SPARC V9 一样,amd64 栈从地址空间的顶部开始减小,而堆则从底部开始扩展数据段。
下图说明了为 64 位应用程序提供的缺省地址空间。地址空间中标记为保留空间的区域可能不是由应用程序进行映射。这些限制在将来的系统中可能会有所放松。
上图中的实际地址描述了特定计算机上的特定实现,仅供参考。