64位x86-64处理器架构.md
本节重点关注所有使用 x86-64 指令集的 64 位处理器的基本架构细节。这些处理器包括 Intel 64 和 AMD64 处理器系列。指令集是已讨论的 x86 指令集的 64 位扩展。以下为一些基本特征:
- 向后兼容 x86 指令集。
- 地址长度为 64 位,虚拟地址空间为 2 64 字节。按照当前芯片的实现情况,只能使用地址的低 48 位。
- 可以使用 64 位通用寄存器,允许指令具有 64 位整数操作数。
- 比 x86 多了 8 个通用寄存器。
- 物理地址为 48 位,支持高达 256TB 的 RAM。
另一方面,当处理器运行于本机 64 位模式时,是不支持 16 位实模式或虚拟 8086 模式的。(在传统模式(legacy mode)下,还是支持 16 位编程,但是在 Microsoft Windows 64 位版本中不可用。)
注意尽管 x86-64 指的是指令集,但是也可以将其看作是处理器类型。学习汇编语言时,没有必要考虑支持 x86-64 的处理器之间的硬件实现差异。
第一个使用 x86-64 的 Intel 处理器是 Xeon,之后还有许多其他的处理器,包括 Core i5 和 Core i7。AMD 处理器中使用 x86-64 的例子有 Opteron 和 Athlon 64。
另一个为人所知的 64 位 Intel 架构是 IA-64,后来被称为 Itanium。 IA-64 指令集与 x86 和 x86-64 完全不同,Itanium 处理器通常用于高性能数据库和网络服务器。
64 位操作模式
Intel 64 架构引入了一个新模式,称为 IA-32e。从技术上看,这个模式包含两个子模式:兼容模式(compatibility mode)和 64 位模式(64-bit mode)。不过它们常常被看做是模式而不是子模式,因此,先来了解这两个模式。
1. 兼容模式
在兼容模式下,现有的 16 位与 32 位应用程序通常不用进行重新编译就可以运行。但是,16 位 Windows(Win16)和 DOS 应用程序不能运行在 64 位 Microsoft Windows 下。
与早期 Windows 版本不同,64 位 Windows 没有虚拟 DOS 机器子系统来利用处理器的功能切换到虚拟 8086 模式。
2. 64 位模式
在 64 位模式下,处理器执行的是使用 64 位线性地址空间的应用程序。这是 64 位 Microsoft Windows 的原生模式,该模式能使用 64 位指令操作数。
基本 64 位执行环境
64 位模式下,虽然处理器现在只能支持 48 位的地址,但是理论上,地址最大为 64 位。从寄存器来看,64 位模式与 32 位最主要的区别如下所示:
- 16 个 64 位通用寄存器(32 位模式只有 8 个通用寄存器)
- 8 个 80 位浮点寄存器
- 1 个 64 位状态标志寄存器 RFLAGS (只使用低 32 位)
- 1 个 64 位指令指针寄存器 RIP
32 位标志寄存器和指令指针寄存器分别称为 EFLAGS 和 EIP。此外,还有一些 x86 处理器用于多媒体处理的特殊寄存器:
- 8 个 64 位 MMX 寄存器
- 16 个 128 位 XMM 寄存器(32 位模式只有 8 个 XMM 寄存器)
通用寄存器
在《32位x86处理器》一节中介绍 32 位处理器时介绍过通用寄存器,它们是算术运算、数据传输和循环遍历数据指令的基本操作数。通用寄存器可以访问 8 位、16 位、32 位或 64 位操作数(需使用特殊前缀)。
64 位模式下,操作数的默认大小是 32 位,并且有 8 个通用寄存器。但是,给每条指令加上 REX(寄存器扩展)前缀后,操作数可以达到 64 位,可用通用寄存器的数量也增加到 16 个:32 位模式下的寄存器,再加上 8 个有标号的寄存器,R8 到 R15。下表给出了 REX 前缀下可用的寄存器。
操作数大小 | 可用寄存器 |
---|---|
8 位 | AL、BL、CL、DL、DIL、SIL、BPL、SPL、R8L、R9L、R10L、R11L、R12L、R13L、R14L、R15L |
16 位 | AX、BX、CX、DX、DI、SI、BP、SP、R8W、R9W、R10W、R11W、R12W、R13W、R14W、R15W |
32 位 | EAX、EBX、ECX、EDX、EDI、ESI、EBP、ESP、R8D、R9D、R10D、R11D、R12D、R13D、R14D、R15D |
64 位 | RAX、RBX、RCX、RDX、RDI、RSI、RBP、RSP、R8、R9、R10、R11、R12、R13、R14、R15 |
还有一些需要记住的细节:
- 64 位模式下,单条指令不能同时访问寄存器高字节,如 AH、BH、CH 和 DH,以及新字节寄存器的低字节(如 DIL)。
- 64 位模式下,32 位 EFLAGS 寄存器由 64 位 RFLAGS 寄存器取代。这两个寄存器共享低 32 位,而 RFLAGS 的高 32 位是不使用的。
- 32 位模式和 64 位模式具有相同的状态标志。