微机原理——8086系统结构

概述:

8086CPU(CISC) 曾是使用广泛的16 位微处理器。80386 和80486(采用了突发总线方式) 及目前流行的Pentium系列都是从8086 发展而来的,称为80x86 系列(首次采用了RISC技术,可以在一个时钟周期内执行一条指令)。8086 是由Intel公司设计生产的,x86架构的鼻祖,具有 40 个引脚的双列直插式封装芯片,内外数据总线都为 16 位,地址总线为 20 位,直接寻址为 1 MB 。最早用于 IBMPC 中的 8088 CPU , 其内部结构与 8086 基本相同,只是 8088 只有 8 条外部数据总线,因此也称为准 16 位微处理器。

80486CPU 是一种全 32 位体系结构的处理机。芯片中包括存储管理部件(MMU )、浮点运算部件(FPU ) 和8 K B 的高速缓存(Cache)。采用80486CPU 组成的微机系统可工作于三种模式:实模式、保护模式和虚拟8086 模式。80486CPU 内部采用了精简指令技术(Reduced Instruction SetComputer, RISC ) , 降低了执行指令的时钟数,达到1.2条指令/时钟。另外,CPU 与内部的 FPU 以及 CPU 与内部的 Cache 之间都采用高速总线传输数据,使得该系统处理速率大大提高。80486 把分段技术和分页技术有机地结合在一起,为存储器管理提供4 级保护。

Pentium微处理机除具有8 0 4 8 6 微处理机的三种工作模式外,还有一种独具特色的系统管理模式(主要包括电源管理),为操作系统和正在运行的程序提供安全管理。

8086 CPU 的内部结构

在这里插入图片描述

EU、BIU

  • 采用执行部件和总线接口并行的流水线结构,可以提高CPU的利用率和处理速度

  • 两部分部件

    1. EU(execution unit)执行单元

      • 功能:负责指令的执行

      • 组成部分

      1. 算术逻辑单元(ALU)
        完成8位或16位的二进制数的算术逻辑运算,绝大部分指令的执行都由ALU完成,运算结果通过内部总线送到通用寄存器组或 BIU 的内部寄存器中,等待写入存储器。在运算时,数据先传送至16位的暂存寄存器中,暂存寄存器用来暂存参加运算的操作数,经 ALU 运算后的结果置入 FR (标志寄存器)中保存。

      2. 标志寄存器(FR)——控制寄存器

        用来反映CPU最近一次运算结果的状态特征或存放控制标志,16位,其中有7位未用
        在这里插入图片描述

        分为两类:

        • 6位运算结果状态标志

          用来表示运算结果的特征,为CF 、PF 、AF 、ZF 、SF 和OF ;

          CF (Carry Flag ) —— 进位/借位标志位

          表示本次运算中最高位(对字操作是 D 15 D_{15} D15 、对字节操作是 D 7 D_7 D7) 有进位(加法运算时)或有借位(减法运算时)。当有进位或借位时,CF=1, 否则 CF=0。执行循环移位指令时也会影响此标志

          CF 标志可以通过STC 指令置位,通过CLC 指令复位(清除进位标志),还可通过CMC 指令将当前CF 标志取反。

          PF (Parity Flag) —— 奇偶校验标志位

          PF = 1 , 表示本次运算结果中有偶数个“1”; PF = 0 , 表示本次运算结果中有奇数个“1”。

          AF(Auxiliary Carry Flag) —— 辅助进位标志位

          AF = 1 , 表示运算结果的 8 位数据中,低 4 位向高 4 位有进位(加法运算时)或有借位(减法运算时),这个标志位只在十进制数运算中有用。

          ZF (Zero Flag) —— 零标志位

          ZF = 1 , 表示本次运算结果为零;ZF = 0 , 运算结果非零。

          SF (Sign Flag) —— 符号标志位

          SF = 1 , 表示本次运算结果的最高位( D 15 D_{15} D15 D 7 D_7 D7) 为 “1” ,否则 SF = 0 。

          OF (Overflow Flag) —— 溢出标志位

          表示本次算术运算结果产生溢出,否则 OF = 0

          所谓 溢出 ,就是字节运算的结果超出了范围 − 128 〜 + 127 -1 2 8 〜 +1 2 7 128+127 , 或者字运算超出了范围 − 32768 〜 32767 -32768〜32767 3276832767。在加法运算时,当次高位向最高位有进位,而最高位又没有向前进位时,便产生溢出,于是 OF = 1 ; 或者,当次高位向最高位无进位,而最高位向前有进位时,同样产生溢出,于是 OF = 1 。在减法运算时,每当判断出最高位需要借位,而低位并不向最高位产生借位时,OF 置 1 ; 或者,每当判断出低位从最高位有借位,而最高位并不需要从更高位借位时,OF 置 1。计算机在进行算术运算时,判断是否溢出的一个简单方法是:运算结果是否合理。例如,当两个正数相加,和为负数时,OF = 1; 否则,OF = 0 。要说明的是,计算机在运算时会影响 OF 标志,但对编程者来说,该标志仅对带符号数有意义。

        • 3位状态控制标志

          用来控制 CPU 的操作,它们是 IF、DF 和 TF 。

          IF ( Interrupt Flag) —— 中断标志位

          IF = 1 , 表示允许CPU 响应可屏蔽中断。IF 标志可以通过 STI 指令置位,也可通过 CLI 指令
          复位。

          DF (Direction Flag ) —— 方向标志位

          在串操作指令中,DF = 0 , 表示串操作指令地址指针自动增量,即串操作的数据由低地址向高地址进行;DF = 1 , 表示地址指针自动减量,即串操作的数据是由高地址向低地址进行的。 DF 标志位可以通过 STD 指令置位,也可通过 CLD 指令复位。

          TF (Trap Flag ) —— 单步标志位(陷阱标志)

          TF = 1 , 表示控制CPU 进入单步工作方式。在这种工作方式下,PCU 每执行完一条指令就自动产生一次内部中断,这在程序调试过程中非常有用。对T F 标志的设定和清除没有专用指令,但可用编程间接达到目的。例如,可先将标志寄存器的内容推入堆找,再设法对标志寄存器的某一位(即T F 位)进行置1 或清零操作,再利用堆栈指令将修改后的数据送入标志寄存器中,这样就可以对该标志进行置位和清零。

      3. 通用寄存器

        • 四个数据寄存器

          通用寄存器既可用来存放 16 位的数据或地址,也可把它们作为 8 位寄存器来使用,即把每个 16 位的通用寄存器分成高 8 位和低 8 位。低 8 位被命名为AL、BL、CL 和 DL , 高 8 位被命名为AH、BH、CH 和DH 。这些寄存器一般存放 8 位数据(只能存放数据,不能存放其他类型数据)。

          AX(Accumulator Register,累加器)

          一般用来存放参加运算的数据和结果,在乘、除法运算、I/O 操作、BCD 数运算中有不可替代的作用。

          BX(Base Register,基址寄存器)

          除可作为数据寄存器外,还可存放内存的逻辑偏移地址,而AX 、CX 、DX 则不能。

          CX(Counter Register,数据寄存器)

          既可作为数据寄存器,又可在串指令和移位(LOOP)指令中作为计数用。

          DX(Data Register, 数据寄存器)

          除可作为通用数据寄存器外,还在乘、除法运算、带符号数的扩展指令中有特殊用途。

        • 四个专用寄存器(地址指针和变址寄存器)

          SI (Source Index , 源变址寄存器)

          多用于存放内存的逻辑偏移地址(隐含的逻辑段地址在数据段寄存器中),也可存放数据。

          • 在串操作指令中,SI规定用作存放源操作数的段内偏移地址DS:SI

          DI (Destination Index , 目标变址寄存器)

          多用于存放内存的逻辑偏移地址(隐含的逻辑段地址在数据段寄存器中),也可存放数据。

          • 规定用作存放目的操作数(目的串)的偏移地址DS:DI

          BP (Base Pointer,基址指针)

          访问堆栈时的基址指针,用于存放内存的逻辑偏移地址(隐含的逻辑段地址在堆栈段寄存器中)。SP、BP经常和SS连用。 SS:BP

          SP (Stack Pointer,堆栈指针)

          用于存放栈顶的逻辑偏移地址(隐含的逻辑段地址在堆栈段寄存器中),堆栈操作指令PUSH和POP就是从SP得到操作数的段内偏移地址的。 SS:SP

      4. EU控制器

        接收从BIU中的指令队列去来的指令,经过指令译码形成各种定时控制信号,向EU内各部分功能发送相应的控制指令,来完成每条指令所规定的操作。

      隐含寻址: 如果在指令中没有明显标出,但指令中又需要使用这些寄存器,通常将其称为“隐含寻址”。隐含寻址实际上是在某类指令中指定某些通用寄存器作为特殊用法。程序设计者在编制程序时需遵循这些规定,将某些特殊数据放在特定的寄存器中,才能正确地执行这些指令。这样也许会给程序设计者带来一些麻烦,但因其采用“隐含”方式,能有效地缩短指令代码的长度。

      在这里插入图片描述

    2. BIU(bus interface unit)总线接口单元

      • 功能: 是 CPU 与存储器及 I/O 端口的接口,负责与外部存储器和I/O端口进行数据交换。形成访问存储器的物理地址、访问存储器并取指令暂存到指令队列中等待执行,访问存储器或 I/O 端口读取操作数来参加 EU 运算或存放运算结果等。

      • 组成部分

        1. 4 个 16 位段地址寄存器 (储存段基址)

          CS ( Code Segment , 代码段寄存器)

          存放程序代码段起始地址的高 16 位。

          DS (Data Segment , 数据段寄存器)

          存放数据段起始地址的高 16 位。

          SS (Stack Segment , 堆找段寄存器)

          存放堆栈段起始地址的高 16 位。

          ES (Extended Segment , 扩展段寄存器)或FS、GS

          存放扩展数据段起始地址的高 16 位。

        2. 16 位指令指针(IP)

          IP 中的内容可由 BIU 自动修改,用来存放将要执行的下一条指令在现行代码段中的偏移地址即

          IP 总是指向下一条待执行的指令。当然,由于指令队列的缘故,这个定义并不十分确切。在正常执行过程中,IP 中存有 BIU 要取出的下一条指令的偏移量,但是当 IP 的内容被保存到堆栈中去时,它首先会自动调整成指向要执行的下一条指令。程序是不能直接访问 IP 的,但可通过某些指令修改 IP 的内容,这类指令主要是程序控制类指令。该类指令可将转移目标地址送入 IP 中,以实现程序的转移,也可以将 IP 内容压入堆栈或从堆栈中弹出。

        3. 20 位物理地址加法器

          地址加法器用于将逻辑地址变成读/写存储器所需的20位物理地址,即完成地址的加法操作。方法是将某一段寄存器的内容(代表段基址)左移4位(相当于*16)再加上16位偏移地址以形成20位物理地址。

        4. 6 字节的指令队列

          当EU正在执行指令且不需要占用总线的时候,BIU 会自动进行预取下一条或几条指令的操作,并按先后次序存入指令队列中排队,由EU按顺序取指进行。

        5. 总线控制逻辑

          用于产生并发出总线控制信号,以实现对存储器和 I/O 端口的读/写控制。它将 CPU 的内部总线与16位的尾部总线相连,从而完成 CPU 与外部设备之间的读/写操作

BIU和EU的工作原理

传统的 CPU 在执行一个程序时,总是先从存储器中取出下一条指令,读出一个操作数(如指令需要操作数的话),然后执行指令。在8086 CPU 体系结构中,这些步骤分配给两个独立的处理单元进行,指令执行部件(EU )负责执行指令,总线接口部件(BIU ) 负责取指令、读出操作数和写入结果。这两个单元能够相互独立地工作,并在大多数情况下,大部分取指令和执行指令重叠进行,即在取指令的同时,指令执行部件也同时工作,这就有效地加快了系统的运算速率

换句话说,执行部件(EU ) 在执行指令时,不必通过访问存储器去取指令,而是从指令队列中取得指令代码,并分析执行它。若在指令执行过程中需要访问存储器或 I/O 端口,EU 只需向 BIU 送出访问存储器的逻辑地址。BIU 将根据 EU 要求形成访问存储器的物理地址,然后访问存储器或I / O端口,取得操作数后送到 EU 中去参加运算,必要时,可将运算结果再写回存储器中。所以,EU 实际上不与外界打交道,所有与外部的操作都在 BIU 控制下完成。

EU 只负责执行指令。在一般情况下,指令是顺序执行的,EU 可源源不断地从指令队列中取得待执行的指令,达到满负荷地连续执行指令,从而节省“取指”时间。如果在指令执行过程中需要访问存储器取操作数,那么 EU 将访问地址送给 BIU 后,等待操作数到来后才能继续操作;遇到转移指令,BIU 会将指令队列中的后继指令作废。这时,EU 等待 BIU 重新从存储器中取出目标地址中的指令代码进入指令队列后,才继续执行指令。在这种情况下,EU 和 BIU 的并行操作会受到一定影响,这是采用重叠操作方式不可避免的现象。只要转移指令出现率不是很高,两者的重叠操作仍然会取得良好效果。顺便指出,EU 处理的所有地址都是 16 位的,但是 BIU 能实现地址浮动,使 EU 可以访问1 MB 的存储空间。

BIU 取指1 取指2 取指3
EU 执行1 执行2 执行3

猜你喜欢

转载自blog.csdn.net/weixin_43229030/article/details/106818998