为什么早期x86处理器寄存器很少?

来自读者的问题

有读者在看我之前的关于16位系统上的调用约定的文章时,有这么一个问题:为什么在早期x86处理器上可用的寄存器为什么那么少?

8086是一款16位的微处理器,比它更早的是8080。它有6个8位寄存器,分别命名为:A, B, C, D, E, H和L。通过两两组合,我们可以用它们产生16位的虚拟寄存器,例如:BC, DE和HL。
另外,你甚至可以将一个16位的地址放入HL寄存器,并用另外一个虚拟寄存器”M”来解引用它。
所以,举个例子,你可以这样写”MOV B, M”,表示:将HL寄存器指向的8位数值加载到B寄存器中。

8086处理器沿用了8080处理器的寄存器设计,并使用了如下的方式对它们进行了映射:
> A => AL
> H => BH, L => BL; HL => BX; M => [BX]
> B => CH, C => CL; BC => CX
> D => DH, E => DL; DE => DX

这就是为什么8086指令集只能通过[BX]而不是[CX]或[DX]来进行解引用操作,以实现将旧的8位代码迁移到新的16位处理器。甚至连MS-DOS操作系统调用也以这种类似的方式进行设计,已实现代码的机器级别转换。

那SI和DI寄存器呢?

我猜想,它们的引入可能来自Z-80上IX和IY寄存器的灵感。Z-80是8080处理器的竞品,它使用了8080的指令集并使用更多的寄存器对指令集进行了扩展。Z-80处理器上,可以通过[IX]和[IY]来解引用,同样的在8086上,也可以通过[SI]和[DI]来解引用。

那BP寄存器呢?

我再次猜想,它的引入是为了能实现基于栈的参数传递。请注意,BP寄存器是8086处理器上唯一一个默认的SS段寄存器,它可以用来直接对内存进行访问。

为什么不能像现代处理器动不动就上16个甚至128个寄存器那样,添加更多的寄存器呢?
为什么在8086处理器上只保留了8个寄存器(AX, BX, CX, DX, SI, DI, BP, SP)呢?
简单来说,是历史原因吧。在8086那会儿,大部分处理器都没有设计很多的寄存器。
另外一款处理器68000,设计了多达16个寄存器,但是如果你仔细看看它的设计文档,这些寄存器中,只有一半能进行通用计算,而另外一半只能用来进行内存访问。

总结

历史(处理器的寄存器个数),由胜利者(Intel)书写。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why does the x86 have so few registers?》

猜你喜欢

转载自blog.csdn.net/mmxida/article/details/108805380