汇编语言简明教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.1 8086的功能结构

处理器由多个功能部件组成。Intel公司按两个功能模块描绘了Intel 8086处理器的内部结构,如图1-2所示。

图1-2 8086的内部结构

1. 总线接口单元和执行单元

图1-2虚线右边部分是总线接口单元BIU(Bus Interface Unit)。它由6字节的指令队列(即指令寄存器)、指令指针IP(等同于程序计数器的功能)、段寄存器(CS、DS、SS和ES)、地址加法器和总线控制逻辑等构成。该单元管理着 8086 与系统总线的接口,负责处理器对存储器和外设进行访问。对外的8086处理器引脚由16位双向数据总线、20位地址总线和若干控制总线组成。8086 所有对外操作必须通过 BIU 和这些总线进行,例如从主存中读取指令、从主存或外设读取数据、向主存或外设写出数据等操作。

图1-2虚线左边部分是执行单元EU(Execution Unit)。它由算术逻辑单元ALU(Arithmetic Logic Unit)、标志寄存器、通用寄存器和进行指令译码的EU控制电路等构成,负责执行指令的功能。

源程序由一条条语句组成,而可执行程序则由一条条指令组成,运行程序就是执行一条条指令的过程。一条指令的整个执行过程又可以分成两个主要阶段:取指和执行,如图1-3(a)所示。

图1-3 指令的执行过程

取指阶段是处理器将指令代码从主存储器中取出并进入处理器内部的过程。8086处理器中,指令在存储器中的地址(即位置编号)由代码段寄存器CS和指令指针寄存器IP共同提供,再由地址加法器得到20位存储器地址。总线接口单元BIU负责从存储器取出这个指令代码,送入指令队列。

执行阶段是处理器将指令代码翻译成它代表的功能(被称为译码)、并发出有关控制信号实现这个功能的过程。8086处理器中,执行单元EU从指令队列中获得预先取出的指令代码,在EU控制电路中进行译码,然后发出控制信号由算术逻辑单元ALU进行数据运算、数据传送等操作。指令执行阶段需要的操作数据有些来自处理器内部的寄存器,有些来自指令队列,还有些来自存储器和外设。如果需要来自存储器或外设的数据,则控制单元EU控制总线接口单元BIU从外部获取这些数据。

2. 指令预取

8086处理器维护着长度为6字节的指令队列,该队列按照“先进先出”FIFO(First In First Out)的方式进行工作。当指令队列中出现空缺时,BIU 会自动取指填补这一空缺;而当程序不能按顺序执行,即发生转移(出现分支)时,BIU又会废除已经取出的指令,重新取指形成新的指令队列。

8086处理器中,指令的读取操作在BIU单元实现,而指令的执行阶段在EU单元完成。因为BIU和EU两个单元相互独立、分别完成各自操作,所以可以并行操作。换句话说,也就是在EU单元对一个指令进行译码执行时,BIU单元可以同时对后续指令进行读取;所以, 8086处理器的指令读取,实际上是指令预取(Prefetch),如图1-3(b)所示。

由于要译码执行的指令已经预取到了处理器内部的指令队列,所以 8086 不需要等待取指操作就可以从指令队列获得指令进行译码执行。而对于简单的处理器来说,在指令译码前必须等待取指操作的完成。取指是处理器最频繁的操作,每条指令都要读取指令代码一到数次(与指令代码的长度有关),所以8086的这种结构和操作方式节省了处理器的许多取指时间,提高了工作效率。这就是最简单的指令流水线技术。同时也看到,程序转移将使预取指令作废,从而降低了流水线效率。