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

【为什么早期x86处理器寄存器很少?】来自读者的问题
有读者在看我之前的关于16位系统上的调用约定的文章时 , 有这么一个问题:为什么在早期x86处理器上可用的寄存器为什么那么少?
8086是一款16位的微处理器 , 比它更早的是8080 。 它有6个8位寄存器 , 分别命名为:A,B,C,D,E,H和L 。 通过两两组合 , 我们可以用它们产生16位的虚拟寄存器 , 例如:BC,DE和HL 。 另外 , 你甚至可以将一个16位的地址放入HL寄存器 , 并用另外一个虚拟寄存器”M”来解引用它 。 所以 , 举个例子 , 你可以这样写”MOVB,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)书写 。
最后
RaymondChen的《TheOldNewThing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。 本文来自:《Whydoesthex86havesofewregisters?》
为什么早期x86处理器寄存器很少?
文章图片


    推荐阅读