intel 8086 cpu 以16 bits 寄存器实现 1MB寻址能力过程的简单分析

写在前面

本篇文章旨在说明题目所述问题,所以并不会对微处理器内部结构做更加详尽的阐述。只会对涉及的结构作简单的描述,因为是小白,所以如果哪里组织的有问题,欢迎各位小伙伴指正。


我们首先来看一下微处理器内部结构 控制器的部件组成:
寄存器
从图中我们可以大致了解到命令在cpu内部的执行过程:

  1. 16 bits 的程序计数器首先从存储器中取得指令放入8 bits 的指令寄存器。
  2. 指令寄存器暂存放入的指令然后交给译码器取进行解析。
  3. 指令译码器将解析后的命令交给控制逻辑部件去执行操作。
    我们知道存储器的内部结构是以字节形式组织的,所以cpu每次只能取得一条指令然后执行,接着重复上述操作,直至所有指令全部执行完毕。这就是早期的串行结构设计。

8086 cpu 有 20 根地址线,所以这个就决定了该cpu能访问外部存储器的空间大小就为 2^20 = 1MB,但是cpu 内部的程序计数器只有16 bits,所以它的寻址能力就被限制在了2 ^ 16 = 64KB大小,那么问题来了,CPU是如何以64k字节寄存器的寻址能力完成 1MB空间大小的查询呢?


为了解决这一瓶颈,intel 公司将外部存储器划分成一个个64k的逻辑段,通过这种方式加上段内地址偏移即可通过16位寄存器实现1MB地址空间的寻址。举个例子:

  • 用户输入一个操作指令,该指令通过总线传递到CPU内部,cpu通过段寄存器(cs)找到相应的逻辑段,接着根据段内指针找到相应的存储单元,将存储单元中的指令通过程序计数器读入指令寄存器,然后执行后续操作。
  • 对于堆栈操作:cpu通过段寄存器(ss)找到相应的逻辑段,然后根据堆栈指针(sp)找到相应的存储单元,接着执行命令的后续流程。

当然了最后的运行结果要经过地址产生与总线控制逻辑运算得到一个20位地址,然后交给相应的接口电路,继而交给程序进行数据的处理。