从某种意义上说,当您使用通用寄存器执行数组(“索引”)类型寻址时,您所做的基本上与段寄存器相同。在过去 8 位和 16 位编程的糟糕日子里,许多应用程序需要比 16 位地址所能达到的更多数据(有时还需要更多代码)。
如此多的 CPU 通过拥有比 16 位地址所能达到的更大的可寻址内存空间来解决这个问题,并通过“段寄存器”或类似的方式使这些内存区域可访问。程序会将“段寄存器”中的地址设置为高于(65536 字节)16 位地址空间的地址。然后在执行某些指令时,它们会将指令指定地址添加到适当的(或指定的)“段寄存器”中,以读取超出 16 位地址或 16 位偏移范围的数据(或代码)。
然而,今天的情况恰恰相反!
怎么会这样?今天,64 位 CPU 可以寻址超过(不少于)所有可寻址的内存空间。今天大多数 64 位 CPU 可以寻址 40 位到 48 位的物理内存。诚然,没有什么可以阻止他们寻址完整的 64 位内存空间,但他们知道没有人(除了 NSA)能负担得起这么多 RAM,此外,将这么多 RAM 挂在 CPU 总线上会因电容而加载它,并减慢 CPU 芯片外的所有内存访问。
因此,当前这一代的主流 CPU 可以寻址 40 位到 48 位的内存空间,这是超过 99.999% 的市场无法想象的。请注意,32 位是 4 GB(今天有些人确实超过了 2、4、8、16 倍),但即使是 40 位也可以寻址 256 * 4GB == 1024GB == 1TB。虽然今天 64GB 的 RAM 是合理的,在极端情况下甚至可能是 256GB,但除了可能 0.001% 的应用程序之外,1024GB 并不是必需的,而且启动起来负担不起。
如果你属于 0.001% 的类别,只需购买一个可寻址 48 位物理内存的 CPU,你说的是 256TB ......目前这是不切实际的,因为它会加载过多的内存总线电容(甚至可能内存总线将完全停止工作)。
重点是这个。当您使用普通 64 位寄存器的普通寻址模式已经可以寻址比您的计算机所能容纳的更多的内存时,添加段寄存器的传统理由就消失了。
这并不意味着人们在 64 位 CPU 中找不到段寄存器的有用用途。他们可以。几种可能性是显而易见的。但是,对于 64 位通用寄存器和 64 位地址空间,没有什么是通用寄存器不能做的,而段寄存器可以。通用寄存器有很多用途,而段寄存器没有。因此,如果有人计划向现代 64 位 CPU 添加更多寄存器,他们会添加通用寄存器(可以做“任何事情”),而不是添加用途非常有限的“段寄存器”。
他们确实有。您可能已经注意到,AMD 和 Intel 不断向 SIMD 寄存器文件添加更多 [sorta] 通用寄存器,并且 AMD 在设计 64 位 x86_64 CPU(Intel复制)。