一、通用寄存器
一个16位寄存器可以存储一个16位的数据,数据在寄存器中的存放情况如图2.2所示。
8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,使原来基于上代CPU编写的程序稍加修改就可以运行在8086之上,8086CPU的AX、BX、CX、DX这4个寄存器都可分为两个可独立使用的8位寄存器来用:
- AX可分为AH和AL
- BX可分为BH和BL
- CX可分为CH和CL
- DX可分为DH和DL
以AX为例,8086CPU的16位寄存器分为两个8位寄存器的情况如图2.3所示:
二、字在寄存器中的存储
在后面的表述中,为了区分不同的进制,在16进制的数据后面加H,在二进制表示的数据后面加B,十进制表示的数据后面什么都不加。
三、几条汇编指令
四、物理地址
CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。
CPU通过地址总线送入寄存器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同的CPU可以由不同的形成物理地址的方式,接下来讨论8086CPU如何在内部形成内存单元的物理地址。
五、16位结构的CPU
六、8086CPU给出物理地址的方法
如上图所示,当8086CPU要读写内存时:
- CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址
- 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
- 地址加法器将两个16位地址合成为一个20位的物理地址
- 地址加法器通过内部总线将20位物理地址送入输入输出控制电路
- 输入输出控制电路将20位物理地址送上地址总线
- 20位物理地址被地址总线传送到存储器
七、“段地址*16+偏移地址=物理地址”的本质含义
用一个例子来说明这种思想:
假设学校、体育馆、图书馆在同一条笔直的单行路上,如图2.8所示,学校位于路的起点。
假如我们只能通过纸条来互相通信,这时你问我图书馆的地址我只能将它写在纸上告诉你。显然,我必须有一张可以容纳4位数据的纸条,才能写下2826这个数据:
可不巧的是,我没有能容纳四位数据的纸条,仅有两张可以容纳3位数据的纸条。这样我只能以这种方式告诉你2826这个数据:
在第一张纸上写上200(段地址),在第二张纸上写上826(偏移地址)。假设我们事前对这种情况又有过相关的约定:在你得到这两张纸后,做这样的运算:200(段地址)*10+826(偏移地址)=2826(物理地址)
8086CPU就是这样一个只能提供两张3位数据纸条的CPU。
八、段的概念
段的划分来自于CPU,由于8086CPU用“基础地址(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。如下图所示,我们可以认为:地址10000H-100FFH的内存单元组成一个段,该段的起使地址(基础地址)为10000H,段地址为1000H,大小为100H;我们也可以认为地址10000H-1007FH、10080H-100FFH的内存单元组成两个段,它们的起使地址(基础地址)为:10000H和10080H,段地址为:1000H和1008H,大小都为80H。
九、段寄存器
十、CS和IP
下图展示了8086CPU读取、执行指令的工作原理(图中只包括了和所要说明的问题密切相关的部件,图中数字都为16进制)。
上图说明如下:
- 8086CPU当前状态:CS中的内容为2000H,IP中的内容为0000H
- 内存20000H-20009H单元存放着可执行的机器码
- 内存20000H-20009H单元中存放的机器码对应的汇编指令如下。
下面的一组图(图2.11-图2.19),以图2.10描述的情况为初始状态,展示了8086CPU读取、执行一条指令的过程。注意每幅图中发生的变化(下面对8086CPU的描述,是在逻辑结构、宏观过程的层面上进行的,隐蔽了CPU的物理结构以及具体的工作细节)。
通过上面的过程展示,8086CPU的工作过程可以简要描述如下:
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
- IP=IP+所读取指令的长度,从而指向下一条指令
- 执行指令,转到步骤1,重复这个过程