Intel 8086微处理器的内外数据总线宽度都是16位的,地址总线为20位,直接寻址空间为1 MB,可访问64 KB的I/O端口。它具有24种寻址方式,可以对字节、字、字符串、组合的和未组合的BCD码等多种数据类型进行处理,它的内部结构按功能可以分为两大部分,即总线接口单元(BIU)与执行单元(EU)。BIU与EU的并行操作减少了取指所需的时间,极大地提高了CPU的利用率。
1.BIU与EU
8086 CPU引脚图与功能结构分别如图2.1和图2.2所示。
图2.1 8086 CPU引脚图
图2.2 8086的功能结构
BIU是8086 CPU同外部的接口部件,它提供了16位双向数据总线和20位地址总线。BIU负责完成所有的外部总线操作,包括取指令、指令排队、读与写操作数、地址转换和总线控制。它由4个16位段寄存器(CS、DS、ES、SS)、指令指针(IP)、20位物理地址加法器、6字节指令队列及总线控制电路组成。
BIU使用指令队列电路来实现流水线操作,该队列为先进先出队列(FIFO),有两个指针,允许预取6字节的指令代码。BIU的操作原则如下。
①每当队列中有2字节空间时,BIU就自动地顺序预取后续指令的代码,并填入指令队列中。
②如果指令队列已满,且EU又无请求,BIU不执行任何总线周期,进入空闲状态。
③当EU在执行中须向BIU申请从内存或I/O口读写操作数时,若此时BIU空闲,则会立即完成EU请求;否则BIU先完成取指令操作,然后进行操作数的读/写总线周期操作。
④如果EU执行转移指令,则BIU清除队列机构,从新地址取得指令,并立即送给EU去执行,然后从后续的指令序列中取指令并填满队列。
EU完成指令译码与执行指令工作。它由ALU、标志寄存器、8个通用寄存器、暂存器、队列控制与时序控制逻辑等部件组成。16位的ALU用来对操作数进行算术逻辑运算。
EU没有连接到系统总线上,所以对系统总线来说,它是“外界”的。
BIU和EU分别完成了取指令与执行指令的任务,两者的控制逻辑之间既各自独立又互相配合。这种既互相配合又非同步的工作方式使得EU在执行指令的同时,BIU又可进行取指令的操作。一般情况下,EU无须等待BIU,仅当某条指令过于频繁地访问内存或遇到转移指令时,EU才会等待BIU。这种取指令和执行指令并行工作的方式是计算机的流水线技术,在286以上的高档微处理器中得到了广泛的应用。
2.8086的寄存器结构
8086 CPU共有14个16位的寄存器,如图2.3所示。它们可分为4组:通用寄存器组、指针与变址寄存器组、段寄存器组和控制寄存器组。
图2.3 8086 CPU寄存器阵列
(1)通用寄存器组:AX、BX、CX、DX
这4个寄存器既可以作为16位的寄存器使用,又可以作为8个单独的8位寄存器使用,并用H和L分别表示高位和低位。这些寄存器的双重性使得8086很容易处理字节和字数据。有部分指令把这些寄存器指定为专用。表2.1列出了通用寄存器的专门用法。
表2.1 8086通用寄存器的专门用法
(www.daowen.com)
(2)指针与变址寄存器组:SP、BP、SI、DI
两个指针寄存器SP与BP用于访问堆栈段中的数据。SP称为堆栈指针,它指示当前堆栈栈顶的地址偏移量,在内存寻址中,凡涉及SP则默认的段寄存器为SS。BP称为基址指针,它指示现行堆栈段的一个数据区的“基址”偏移量,用它来访问堆栈段中的数据。
两个变址寄存器SI与DI用来存放字符串操作时源与目的操作数段内的偏移地址,所以又称为源变址和目的变址寄存器。SI与DI在串操作时对应的段寄存器分别为DS与ES,在使用时不可混淆。
这组寄存器主要用来存放地址,但也可以作为通用寄存器存放数据。
(3)段寄存器组:CS、DS、ES、SS
这4个16位段寄存器分别识别当前代码段、数据段、堆栈段和附加段,彼此不能互换使用。因为8086有20位物理地址,而CPU内部只设置了16位寄存器,所以20位物理地址在CPU内部是由两部分相加形成的。SI、DI、SP和BP用来指明低16位的偏移量;而CS、DS、ES和SS则用来指明20位物理地址的高16位,故称为段寄存器。BIU中有一个20位的地址生成加法器,CPU自动将相应的段寄存器的内容左移4位,再加上对应的16位偏移量,形成20位的物理地址。
20位物理地址=段寄存器×24+对应的16位地址偏移量。
(4)控制寄存器组:IP、FR
指令指针IP的功能与一般CPU中的程序计数器PC类似,它总是指向下一条待取指令的地址偏移量。IP与PC又略有差别,8086中IP要与CS配合才能形成真正的物理地址。用户不可随意改变其值,只有遇到CALL、INT、JMP等指令时才可改变其值。程序不能直接访问IP。在用DEBUG调试程序时可用调试命令改变其值。
标志寄存器FR将在后面介绍。
3.8086中的标志寄存器与堆栈
(1)标志寄存器
8086 CPU中有一个16位的标志寄存器FR,共设了9个标志位,其他7位是无用位,如图2.4所示。其中CF、PF、AF、ZF、SF和OF为6个状态标志位,用以反映算术逻辑运算结果的某些特征;IF、DF、TF为3个控制标志位,用以控制中断、串操作时地址的增减量以及是否单步运行。
图2.4 8086 CPU中的标志寄存器
8086的指令系统中影响6个状态标志位的指令有算术逻辑运算、字符串比较与搜索、移位与循环移位等。应注意:无论是字操作还是字节操作,PF只根据操作结果的低8位中“1”的个数是偶数还是奇数置位;AF只根据算术运算中数据位D3向D4位的进、借位状态置位,该标志位主要用于BCD码运算结果的调整。
8086的3个控制标志位为IF、DF和TF。IF与DF设有专门的指令使其置1或置0,而TF没有专门的置1或置0的指令,要使TF置1或置0需用几条指令间接地实现。
(2)堆栈
堆栈是一个按照后进先出(LIFO)的原则存取数据的部件。计算机中有硬件堆栈和软件堆栈,堆栈由栈区和堆栈指针组成。8086/8088设置的是软件堆栈,栈指针(SP)始终指向栈顶,即始终指向最后推入堆栈的数据所在单元。SP可以实现对堆栈的自动管理。
主程序在调用子程序(或转向中断服务程序)时,为了能把断点与有关的寄存器、标志位及时正确地保护下来,并能保证逐次正确返回,就需要一个堆栈完成这一任务。
8086 CPU中有两个与堆栈有关的寄存器,一个是SS,它标识现行堆栈段的基地址;另一个是SP,标识现行堆栈段内的偏移地址。8086中的堆栈是“向下生成”的堆栈,即SP所指存储单元的地址随着栈中数据增加而变小。
堆栈操作有专门的PUSH与POP指令,每次压入与弹出都是16位数据。应记住:PUSH操作时,先SP-1,压入高位字节,再使SP-1,压入低位字节;弹出时与上述相反,先弹出低8位,SP+1,再弹出高8位,SP+1。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。