我们说8086CPU的上一代CPU(8080、8085)等是8位机,而8086是16位机,也可以说8086 是16位结构的CPU。
8086CPU 的所有寄存器都是 16 位的,可以存放两个字节。AX、BX、CX、DX 这 4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,使原来基于上代CPU 编写的程序稍加修改就可以运行在 8086 之上, 8086CPU 的 AX、BX、CX、DX 这 4个寄存器都可分为两个可独立使用的8位寄存器来用:
以AX为例, 8086CPU的16位寄存器分为两个8位寄存器的情况如下图所示。
AX的低 8 位(0位~7位)构成了AL寄存器,高 8 位(8 位~15位)构成了AH寄存器。AH 和 AL 寄存器是可以独立使用的 8 位寄存器。
注意,为了使具有高级语言基础的读者更好地理解指令的含义,有时会用文字描述和高级语言描述这两种方式来描述一条汇编指令的含义。在写一条汇编指令或一个寄存器的名称时不区分大小写。如: movax,18和MOVAX,18的含义相同; bx和BX的含义相同。
8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。从8086CPU的内部结构来看,如果将地址从内部简单地发出,那么它只能送出 16 位的地址,表现出的寻址能力只有64KB。
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
如上图所示,当 8086CPU 要读写内存时:
地址加法器采用物理地址=段地址×16+偏移地址的方法,用段地址和偏移地址合成物理地址。例如, 8086CPU要访问地址为123C8H的内存单元,此时,地址加法器的工作过程如下图所示(图中数据皆为十六进制表示)。
以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16 定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。有两点需要注意:段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位, 16位地址的寻址能力为64KB,所以一个段的长度最大为64KB.
段地址在8086CPU的段寄存器中存放。8086CPU有4个段寄存器: CS、 DS、SS、ES。当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址。本章中只看一下CS。
CS 和 IP是 8086CPU中两个最关键的寄存器,它们指示了CPU 当前要读取指令的地址。CS为代码段寄存器, IP为指令指针寄存器,从名称上我们可以看出它们和指令的关系。
在8086PC机中,任意时刻,设CS中的内容为M, IP中的内容为N, 8086CPU将从内存 Mx16+N 单元开始,读取一条指令并执行。
下图展示了 8086CPU 读取、执行指令的工作原理(图中只包括了和所要说明的问题密切相关的部件,图中数字都为十六进制)。
上图说明如下:
下面的一组图,以上图描述的情况为初始状态,展示了8086CPU读取、执行一条指令的过程。注意每幅图中发生的变化(下面对8086CPU的描述,是在逻辑结构、宏观过程的层面上进行的, 目的是使读者对CPU工作原理有一个清晰、直观的认识,为汇编语言的学习打下基础。其中隐蔽了CPU的物理结构以及具体的工作细节)。
下面的一组图(图 2.20-图 2.26),以图 2.19 的情况为初始状态,展示了 8086CPU 继续读取、执行3条指令的过程。注意IP的变化(下面的描述中,隐蔽了读取每条指令的细节)。
通过上面的过程展示,8086CPU的工作过程可以简要描述如下。
在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH, IP=0000H,即在8086PC机刚启动时, CPU从内存FFFFOH 单元中读取指令执行, FFFFOH单元中的指令是8086PC机开机后执行的第一条指令。现在,我们更清楚了CS和IP 的重要性,它们的内容提供了CPU要执行指令的地址。
CPU从何处执行指令,是由CS、IP中的内容决定的,程序员可以通过改变 CS、IP 中的内容,来控制 CPU 执行目标指令。若想同时修改 CS、IP的内容,可用形如“jmp 段地址:偏移地址”的指令完成,如:
"jmp 段地址:偏移地址”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改 IP。
8086 CPU 中寄存器总共为 14 个,且均为 16 位 。即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 个。而这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。
缩写 | 含义 |
---|---|
AX,BX,CX,DX称作为数据寄存器 | AX (Accumulator):累加寄存器,也称之为累加器; BX (Base):基地址寄存器; CX (Count):计数器寄存器; DX (Data):数据寄存器; |
SP 和 BP又称作为指针寄存器 | SP (Stack Pointer):堆栈指针寄存器; BP (Base Pointer):基指针寄存器; |
SI 和 DI又称作为变址寄存器 | SI (Source Index):源变址寄存器; DI (Destination Index):目的变址寄存器; |
AX、BX、CX、DX 这 4个寄存器,都可分为两个可独立使用的8位寄存器来用:
8086CPU有4个段寄存器: CS、 DS、SS、ES。
8086CPU的物理地址,是用段地址和偏移地址合成的,物理地址=段地址×16+偏移地址。
因此,在8086PC机中,任意时刻,8086CPU将从内存 CSx16+IP 单元开始,读取一条指令并执行。
可通过“jmp 段地址:偏移地址”指令,修改CS和IP寄存器中的值。
jmp 3:0B16,执行后:CS=0003H, IP=0B16H,CPU 将从00B46H处读取指令。
参考文档: