微机原理与接口技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第3章 8086微型计算机系统

3.1 8086微处理器的结构

8086是Intel系列的16位微处理器,采用HMOS工艺制造,有16根数据线和20根地址线,采用40脚双列直插式(DIP)封装,如图3-1所示。它可寻址的内存地址空间为220B,即1MB;I/O地址空间为216B,即64KB。

8086工作时,使用单一的+5V电源,时钟频率为4.77~10MHz,引脚信号与TTL电平兼容。Intel公司在推出8086的同时,还推出了一款准16位的CPU——8088。8088的设计目的是为了能与当时已有的一整套Intel的8位外围接口芯片直接兼容。8088与8086的内部结构基本相同,两者的软件也完全兼容。它们的主要区别是:8086的数据总线是16位的,而8088的数据总线是8位的。因此,8088执行相同的程序比8086有更多的外部存取操作,执行速度慢。本书仅介绍8086。

图3-1 8086微处理器

3.1.1 8086的内部结构

8086的内部结构如图3-2所示,它由执行部件EU(Execution Unit)和总线接口部件BIU(Bus Interface Unit)两部分组成,这两个部件可以并行工作。

图3-2 8086功能结构图

1.执行部件(EU)

EU由算术逻辑单元(ALU)、8个通用寄存器、标志寄存器及控制电路组成。ALU可完成8位或16位数的算术或逻辑运算。

EU负责指令的执行,即从总线接口部件BIU的指令队列取指令,指令执行后向BIU送回运算结果,同时把运算结果的状态特征保存到标志寄存器中。

EU不直接与外部系统相连。当需要与主存储器或I/O设备交换数据时,EU向BIU发出命令,并向BIU提供16位的有效地址及所需要传送的数据。

2.总线接口部件(BIU)

总线接口部件由4个16位段寄存器、16位的指令指针寄存器(IP)、20位的地址加法器、内部暂存器、6字节指令队列缓冲器和总线控制逻辑组成。它负责CPU与存储器、I/O设备之间的数据传送。BIU完成以下操作:取指令送给指令队列、配合执行部件从指定的内存单元或者外设端口中取数据、将数据传送给执行部件或者把执行部件的操作结果传送到指定的内存单元或外设端口中。

(1)段寄存器

8086采用存储器地址分段的方法来解决在16位字长的计算机里提供20位地址的问题。段寄存器就是专门存放段地址的寄存器,每个段寄存器的值可以确定一个段的起始地址,而各段有不同的用途。8086中有4个16位段寄存器,它们是:CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)和ES(附加段寄存器)。

(2)指令指针寄存器IP

指令指针寄存器IP保存下一条要取出的指令所在存储单元的16位偏移地址。

(3)地址加法器

地址加法器用来产生20位的地址。8086可用20位地址寻址1MB的内存空间,但8086内部所有的寄存器都是16位的,8086采用存储器地址分段的方法解决这个问题。地址加法器能够根据16位段地址和16位段内偏移地址计算出20位的物理地址。

(4)内部暂存器

内部暂存器用于暂存内部数据。该部件对用户透明(即感觉不到它的存在),用户在编程时无权访问。

(5)指令队列缓冲器

8086指令队列缓冲器有6字节,采用“先进先出”策略,暂时存放BIU从存储器中预取的指令。一般来讲,EU执行完一条指令后,可立即从指令队列中取指令执行,省去了CPU等待取指令的时间,提高了CPU的效率。

(6)总线控制逻辑

总线控制逻辑发出总线控制信号,实现存储器的读/写控制和I/O的读/写控制。它将CPU内部总线与外部总线相连,控制CPU与外部电路进行数据交换。

3.BIU和EU的工作过程

8086的BIU和EU在很多时候可以并行工作,使得取指令、指令译码和执行指令这些操作构成操作流水线。

① 当指令队列中有两个空字节,且EU没有访问存储器和I/O接口的要求时,BIU会自动把指令取到指令队列中。

② 当EU准备执行一条指令时,它会从指令队列前部取出指令执行。在执行指令的过程中,如果需要访问存储器或者I/O设备,那么EU会向BIU发出访问总线的请求,以完成访问存储器或者I/O接口的操作。如果此时BIU正好处于空闲状态,那么,会立即响应EU的总线请求;但如果BIU正在将某个指令字节取到指令队列中,那么,BIU将首先完成这个取指令操作,然后再去响应EU发出的访问总线的请求。

③ 当指令队列已满,而且EU又没有总线访问时,BIU便进入空闲状态。

④ 在执行转移指令、调用指令和返回指令时,下面要执行的指令就不是在程序中紧接着的那条指令了,而BIU往指令队列装入指令时,总是按顺序进行的。在这种情况下,指令队列中已经装入的指令就没有用了,会被自动消除。随后,BIU会往指令队列中装入另一个程序段中的指令。

3.1.2 8086的寄存器结构

寄存器是CPU内部用来存放地址、数据和状态标志的部件。8086有14个16位寄存器和8个8位寄存器。按用途可以分为以下几类:数据寄存器、指针和变址寄存器、段寄存器、指令指针寄存器和标志寄存器。

1.数据寄存器

EU中有4个16位的寄存器:AX、BX、CX、DX和8个8位的寄存器:AH、AL、BH、BL、CH、CL、DH、DL,它们均可独立使用。数据寄存器主要用来存放操作数或中间结果,以减少访问存储器的次数。多数情况下,这些数据寄存器用在算术运算或逻辑运算指令中。在有些指令中,它们则有特定的用途。数据寄存器的用法见表3-1。

表3-1 8086数据寄存器的一般用法和隐含用法

2.指针和变址寄存器

EU中有两个16位指针寄存器SP、BP和两个16位变址寄存器SI、DI,它们的用法见表3-2。

表3-2 8086中指针和变址寄存器一般用法和隐含用法

3.段寄存器

8086CPU中有4个16位的段寄存器,用于存放当前程序所用的各段的起始地址(也称段基址)。它们分别是:

① CS(Code Segment),称为代码段寄存器,存放当前执行的程序所在段的起始地址。CS的值乘以16D后加上IP的值,就形成了下一条要取出指令所在的内存单元的物理地址。

② DS(Data Segment),称为数据段寄存器,存放当前数据段的起始地址。DS的值乘以16D后加上指令中存储器寻址方式指定的偏移地址,就形成了要进行读/写的数据段中指定内存单元的物理地址。

③ SS(Stack Segment),称为堆栈段寄存器,存放当前堆栈段的起始地址。堆栈是按照“后进先出”原则组织的一个特殊内存区域。堆栈操作数的地址由SS的值乘以16D后加上SP的值形成。

④ ES(Extra Segment),称为附加段寄存器,存放当前附加段的起始地址。附加段是附加的数据段,也用于数据的保存。另外,串操作指令将附加段作为其目标操作数的存放区域。

4.指令指针寄存器

8086有1个16位指令指针寄存器(Instruction Pointer,IP),存放当前代码段的偏移地址。它与CS联用,可以形成下一条要取出指令的物理地址。程序不能直接读写IP,但在程序运行中IP值会被自动修改。例如,控制器取到要执行的指令后,会立刻修改IP值,使之指向下一条指令的首地址;转移、调用、返回等指令执行,就是通过修改IP的值来控制指令序列的执行流程的。

5.标志寄存器

8086 CPU设置了1个16位的标志寄存器FR,也称为程序状态寄存器或程序状态字PSW(Program Status Word)。PSW各位的含义如图3-3所示。

图3-3 标志寄存器PSW

图3-3中标明了9个标志位,未标明的位在8086中不用。PSW的9个标志按其作用可以分为:状态标志和控制标志两大类。

(1)状态标志

状态标志记录程序中运行结果的状态信息,是根据指令的运行结果由CPU自动设置的。这些状态信息通常作为后续转移指令的转移控制条件,所以也称为条件码。

  • CF(Carry Flag)进位标志:记录运算时最高位上产生的进位或借位值。有进位或借位时CF置1,否则CF清0。
  • PF(Parity Flag)奇偶标志:运算结果的低8位中有偶数个1时PF置1,否则PF清0。
  • AF(Auxiliary Carry Flag)辅助进位标志:记录运算时第3位产生的进位或借位值。有进位或借位时AF置1,否则AF清0。
  • ZF(Zero Flag)零标志:运算结果为零时ZF置1,否则ZF清0。
  • SF(Sign Flag)符号标志:运算结果为负数时SF置1,否则SF清0。
  • OF(Overflow Flag)溢出标志:运算结果超出机器数表示范围时,称为溢出,此时OF置1,否则OF清0。

(2)控制标志

控制标志可以编程设置,用于控制处理器执行指令的方式。控制标志设置之后,可对后面的操作产生控制作用。

  • DF(Direction Flag)方向标志:控制串操作指令中存储器地址的变化方向。DF=0时,串操作过程中存储器地址会自增值,即进行从低地址到高地址方向的串操作;DF=1时,则串操作过程中存储器地址会自动减值,即进行从高地址到低地址方向的串操作。
  • IF(Interrupt Enable Flag)中断允许标志:控制外部可屏蔽中断。IF=0时,CPU不能对可屏蔽中断请求作出响应,即禁止外部可屏蔽中断;IF=1时,CPU可以接收可屏蔽中断请求,即允许外部可屏蔽中断。
  • TF(Trap Flag)单步标志:控制处理器进入单步工作方式。TF=1时,处理器进入单步工作方式;TF=0时,处理器正常工作。

调试程序(Debug)提供了查看标志位的手段,它用符号表示标志位的值,见表3-3。

表3-3 Debug中标志位的符号表示