为什么设计CS:IP寄存器?

认识寄存器
寄存器的官方叫法有很多,Wiki 上面的叫法是,也可以称为 CPU  , 计算机中经常有一个东西多种叫法的情况,反正你知道都说的是寄存器就可以了 。
认识寄存器之前,我们首先先来看一下 CPU 内部的构造 。
CPU 从逻辑上可以分为 3 个模块,分别是控制单元、运算单元和存储单元,这三部分由 CPU 内部总线连接起来 。
几乎所有的冯·诺伊曼型计算机的 CPU,其工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数、结果写回 。
计算机架构中的寄存器
寄存器是一块速度非常快的计算机内存,下面是现代计算机中具有存储功能的部件比对 , 可以看到 , 寄存器的速度是最快的,同时也是造价最高昂的 。
我们以 intel 8086 处理器为例来进行探讨,8086 处理器是 x86 架构的前身 。在 8086 后面又衍生出来了 8088。
在 8086 CPU 中,地址总线达到 20 根 , 因此最大寻址能力是 2^20 次幂也就是 1MB 的寻址能力,8088 也是如此 。
在 8086 架构中,所有的内部寄存器、内部以及外部总线都是 16 位宽,可以存储两个字节,因为是完全的 16 位微处理器 。8086 处理器有 14 个寄存器,每个寄存器都有一个特有的名称,即
AX,BX,CX , DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES
这 14 个寄存器有可能进行具体的划分,按照功能可以分为三种

为什么设计CS:IP寄存器?

文章插图
接下来我们将焦点放在CS:IP寄存器上 。
CS:IP 寄存器为什么设计CS:IP寄存器?
初学者可能会有疑问,为什么要这么折腾?为什么不直接设计一个寄存器取代CS和IP寄存器?这就涉及到CPU的发展历史了 , 这里我们先说一句特别的感悟:CPU的发展是连续迭代的过程,新的设计要兼容旧的设计 。之前一直不明白这句话的含义,或者是忽略了这句话,我们知道CPU是一种神奇的发明,可以说,CPU是现代所有科技的大脑和帮手 , 每一代的CPU都会有数以千万级的硬件产品使用,除非是上帝,任何人也不能说一下子就能设计永远不过时的架构,所以CPU是一个逐步迭代的产品,迭代的原因就是旧的架构或资源过时了,需要新的架构或者优化,但是我们在设计新的CPU架构时,必须也不得不考虑兼容性,兼容上一代的产品,这虽然给设计人员增加了设计难度 , 但是也是不得已为之,好了 , 上面说了很多正确的废话,接下来简单的说下为什么需要CS和IP寄存器,我们先说一下历史,不严谨的说:
在上古CPU中,类似于现在的小型单片机,是没有CS和IP寄存器的 , 因为内存少的可怜,比如16位的CPU,最大就能访问2^16 byte,即64Kb的内存 , 也就是地址线、数据线、寄存器都是16位,访问内容完全都是统一的 , 一点都不会乱,而且那会儿64Kb的内存空间已经足够用了 。
随着应用程序的发展 , 对内存的需求也更多了(2021年,4G内存都沦落到乞丐配置了),所以相比上一代的64Kb , 8086处理器的设计目标是1M的大内存空间,相当于提升到上一代的16倍,1M的空间对应的地址总线就是20位 。
【为什么设计CS:IP寄存器?】如上所属,愿望是很好的,一个很现实的问题就摆在Intel设计人员面前 , 地址线宽度是20位,但是CPU中的算数逻辑运算单元(ALU) 仍然是16位,而且很尴尬的是,当时的制造技术很难把ALU加工到20位,即便是有能力加工到20位,也无法兼容上一代的CPU了 , 当然也有其他的方案,比如增设一些20位的指令和寄存器,专门用于地址的运算和操作,但是那样又造成CPU内存结构的不均匀 , 基于上面的原因,Intel的工程师设计了一种在当时看来很巧妙的方法,即分段方法 。也就是前面提到的CS:IP结合的算法 , CS和IP都是16位,CS左移4位,然后与IP相加 , 得到20位的地址 。这样就实现了从16位内存地址到20位实际地址的转换 。
参考文章