首页 > 汇编语言 > x86处理器架构 阅读:15,502

64位x86-64处理器架构


本节重点关注所有使用 x86-64 指令集的 64 位处理器的基本架构细节。这些处理器包括 Intel 64 和 AMD64 处理器系列。指令集是已讨论的 x86 指令集的 64 位扩展。以下为一些基本特征:

1) 向后兼容 x86 指令集。

2) 地址长度为 64 位,虚拟地址空间为 2 64 字节。按照当前芯片的实现情况,只能使用地址的低 48 位。

3) 可以使用 64 位通用寄存器,允许指令具有 64 位整数操作数。

4) 比 x86 多了 8 个通用寄存器。

5) 物理地址为 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 位模式具有相同的状态标志。