一、 8086/8088微处理器的基本结构
Intel 8086 微处理器有16位寄存器和16位外部数据总线,20位地址总线,寻址为1MB的地址空间。Intel 8088 微处理器的外部数据总线为8位,其他与8086是一样的。
图一 8086微处理器的结构
从图中可以看出,8086 CPU从功能上划分成两部分:总线接口单元BIU(Bus Interface Unit)和执行单元EU(Execution Unit).
BIU作为总线控制单元,负责与存储器及IO接口来传输数据;EU作为执行单元,负责执行指令。具体来说,BIU根据EU的请求,将指令送到指令流队列中排队,为EU提供即将执行的指令;EU从BIU的指令队列取得的指令和数据,来对片外操作数(片外就是指CPU以外存储数据的地方,比如存储器,IO接口等)进行访问的。这样EU与BIU可独立工作,BIU在保证EU与片外传输操作数的前提下,可进行指令预取,与EU可重叠操作。取指部分与执行部分可分开进行,提高CPU的利用率。(8086指令队列出现2个空字节,且EU未占总线,BIU自动取指令填充队列。)
EU的组成部分:16位通用寄存器组(AX,BX,CX,DX,SP,BP,SI,DI)、算术逻辑单元(ALU)、标志寄存器(FLAG)、操作控制器电路。
BIU的组成部分:段寄存器组(CS,DS,SS,ES)、指令指针(IP)、地址加法器、指令队列缓冲器、总线接口控制逻辑。
EU的各个组成部分介绍:
1. 16位通用寄存器组(AX,BX,CX,DX,SP,BP,SI,DI)
(1)4个16位通用的数据寄存器:AX、BX、CX、DX,又可以各分为两个8位的寄存器:AL、AH、BL、BH、CL、CH、DL、DH
其中:
AX: 具有累加功能,可作16位累加器,AL可作为8位累加器。
BX: 在基址变址寻址时作为基址寄存器。
CX: 在循环类与串处理类指令执行时作为默认的计数器寄存器。
DX: 作为数据寄存器使用,在双字运算中存放高16位数据。
(2)另外四个地址指针和变址寄存器
SP(Stack Pointer):堆栈指针寄存器,用来指出堆栈的顶部偏移地址。
BP(Base Pointer):基地址指针寄存器,在间接寻址时作为基地址寄存器。
SI(Source Index):源变址寄存器,在间接寻址时作为地址寄存器或变址寄存器。在字符串处理指令中,作为目的变址寄存器。
DI(Destination Index):目的变址寄存器,在间接寻址时作为地址寄存器或变址寄存器。在字符串处理指令中,作为源变址寄存器。
2.算术逻辑单元(ALU)
它主要完成算术运算、逻辑运算。
3.标志寄存器(FLAG)【1】
它是一个16位的寄存器,用来记录程序中运行结果的状态信息,它们是根据有关指令的运行结果由 CPU 自动设置的。其中9位有定义, 9位中6位表示状态,3位表示控制标志,见图二:
图二 标志寄存器(FLAG)
(1)进位标志(CF):运算指令执行之后,若在最高位上产生进位、借位时,该标志位被置1。 具体地说,两个数相加时,最高位(D15或D7)有进位,或当两个数相减时,最高位有借位,进位标志位被置1,即CF=1;否则CF=0。
(2)奇偶标志(PF):8086/8088 CPU中采用奇校验,运算指令执行后,运算结果的低8位中含1的位数为偶数时,该标志位被置1,否则被置0。也称为偶标志位。
(3)辅助进位标志(AF):运算指令执行后。当两个数相加(减)时,当D3有向D4进(借)位时,该标志位被置1,否则被置0。
(4) 全零标志(ZF):运算指令执行后,结果的每一位都为零时该标志位被置1。
(5) 符号标志(SF):在带符号数运算时,如果运算结果最高位为1,表示结果为负值,SF位被置1,否则SF位被置0。SF也称为负标志位。
(6)溢出标志(OF):运算指令执行后,结果的数值产生溢出,该标志位被置1,否则被置0。
(7)方向标志(DF):用于字符串指令操作,当DF=0时,字符串处理由低地址向高地址处理;当DF=1时,则从高位地址向低位地址处理。
(8)中断允许标志(IF):用来控制可屏蔽硬件中断。当IF=1时8086微处理器可以接受片外来的可屏蔽中断请求,开中断;IF=0时片外来的中断请求被阻止,关中断,也称被屏蔽。
(9)陷阱标志(TF):该标志用来控制单步中断。在TF=1时,以单步方式执行程序。即8086每执行完—条指令就产生处理器内部单步中断。单步执行指令可使程序员跟踪指令的执行过程,进行积序的调试。
4.操作控制电路
操作控制电路是8086微处理器的控制核心,首先将指令队列中送来的一条指令进行译码,然后根据不同指令的功能产生出所需要的控制信号来控制各相关功能部件的操作。
BIU的各个组成部分介绍:
1.段寄存器组(CS,DS,SS,ES)
CS:代码段寄存器,存放当前将被执行的程序的段地址。
DS: 数据段寄存器,存放当前被执行的程序所用操作数的段地址。
SS:堆栈段寄存器,存放当前被执行的程序所用堆栈的段地址。
ES:附加段寄存器,存放当前被执行程序所用操作数的段地址。
其中,DS、SS和ES寄存器的内容可由程序设置,而CS寄存器的内容不能用程序设置。
2.指令指针寄存器(IP)
它主要用来存放将要执行的下一条指令的偏移量,与CS联合形成下一条指令的物理地址。
3.地址加法器
它用来计算物理地址的,物理地址的形成:
物理地址 = 段基地址×10H + 偏移量
8086微处理器有20条地址总线,可寻址1MB的存储器空间。由于8086微处理器是一个16位结构,段寄存器均为16位,这样16位寄存器就无法存放20位地址了。为了解决这个问题,8086内部就设置了一个20位的地址加法器,它首先将16位的段地址左移4位,然后再与16位的偏移地址相加形成20位的物理地址,如图三:
图三 物理地址形成示意图
举个例子,每当取指令的时,则自动选择代码段寄存器CS,再加上由指令指针寄存器(IP)提供的16位偏移量,按上述方法计算后得到所要取的指令的20位物理地址。
4.指令队列缓冲器
它是一个6B的先进先出缓冲器。8086微处理器具有指令预取功能,当执行部件(EU)不使用总线接口部件与片外进行数据传送,总线接口部件就可以从存储器中读取指令填充指令队列缓冲器。 8088微处理器的指令队列缓冲器只有4B深度。
5.总线接口控制逻辑
这部分电路是处理器与外部总线的接口,它首先把已形成的20位地址码经地址线送出片外,然后经数据总线进行操作数或指令代码的传输。操作数送相关寄存器或由相关寄存器送到片外,而指令代码从片外存储器读入到指令队列等待译码执行。
二、8086/8088微处理器的存储器管理
8088/8086CPU有20条地址总线,可寻址1MB的存储器空间。由于8086微处理器是一个16位结构,段寄存器均为16位,16位寄存器就无法存放20位地址了,如何解决这个问题请参见上面的地址加法器的介绍。
前面说了,8086微处理器是一个16位结构,段寄存器均为16位,那么最大的寻址范围为64K。8086/8088把1M主存空间划分为若干段,每个段由连续的字节单元组成,最大长度为64K(即65536)。每个段可作为独立寻址的逻辑单位,一个段中的代码和数据,可存放在该段内的任意单元中。每个段的起始地址必须能够被16整除,即在20位的段基址中最低4位必须是“0”。每个段首地址的高16位二进制代码就是该段的段号(称段基地址)或简称段地址,段地址存放在段寄存器CS、DS、SS、ES中,对段寄存器设置不同的值来使微处理器的段寄存器指向存储器中不同的段。 【2】
在程序中设置的段称为逻辑段。各逻辑段的大小按实际需要确定,最大为64KB,实际应用时可小于64KB,其未用空间可再定义为其它段的空间,因而可出现段的重叠。各逻辑段可以是邻接的、间隔的、部分重叠的和完全重叠的。【3】
在8086/8088微处理器中,描述存储器地址的三个相关术语:物理地址、偏移地址、逻辑地址。
(1)物理地址:是由8086/8088芯片地址引线送出的20位地址码,它用来参加存储器的地址译码,最终读/写所访问的的一个特定的存储单元。
(2)偏移地址:某个存储单元相对于该段首地址的差值,用16位二进制代码。
(3)逻辑地址:是在程序中对存储器地址的一种表示方法:
逻辑地址 = 段地址:偏移地址
参考资料:
【1】http://www.sgrtvu.net.cn/jx_data/lg_data/czs/wjjk/chapter2_2a.htm
【2】http://www.hljrtvu.com/xbwz/lg/myweb/d2/2.2.htm
【3】http://hi.baidu.com/hyap/blog/item/4fbdeafe3f9c2d375d60086c.html