0%

ch2微处理器8086

8086(微处理器CPU)组成

  • 功能分类:

    控制器, 运算器(ALU), 寄存器组, 系统总线

    控制器分为:

    • 指令寄存器IR (Instruction Register)
    • 指令译码器ID (Instruction Decoder)
    • 定时与控制电路
  • 编程结构分类:(程序员和使用者的角度)

    • 总线接口部件(bus interface unit, BIU)

      传送data —> 存储器(Cache, RAM, ROM)、I/O端口(即输入输出接口电路)

      • 16位段地址寄存器

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

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

        SS (Stack Segment) — 堆栈段寄存器

        ES (Extra Segment) — 扩展段寄存器

      • 16位指令指针寄存器 IP (Instruction Pointer)

        指向下一条指令的地址 in 当前代码段(CS)。取出一个字节指令后,IP += 1

        转移指令、调用指令、中断和复位 ==> 改变IP值

      • 20位物理地址的加法器

        段地址*16+段内偏移量--20位实际物理地址

        (CS, DS, SS, ES)*16 + (IP, SP, BP, DI, SI)

      • 6个字节Bytes的指令队列(ISQ)

        when 执行指令:

        指令: 内存取 -> 指令队列缓冲器

      • 输入输出控制电路

    • 执行部件(execution unit, EU)

      执行 指令

      • 16位算术逻辑单元ALU

      • 16位数据寄存器

        AX、BX、CX、DX,又可以分为8个8位寄存器使用:

        AH、AL、BH、BL、CH、CL、DH、DL

        AX和AL可用作累加操作

        BX可作基址指针寄存器,与DS配对

      • 16位地址指针寄存器

        SP (Stack Pointer)— 堆栈指针寄存器

        堆栈段中的栈顶位置,与SS配对

        BP (Base Pointer) — 基址指针寄存器

        数据区的基址位置,与SS配对

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

        某一存储单元的偏移地址,与DS配对

        串操作:源string DS:SI

        DI (Destination Index)— 目的变址寄存器

        某一存储单元的偏移地址,与DS配对

        串操作:目标string ES:DI

      • 16位状态标志寄存器 FLAG

        • 6个状态标志:

          CF (Carry Flag)— 进(借)位标志,若运算结果最高位产生进位或借位则CF置“1”,否则置“0”;

          AF (Auxiliary Flag)— 辅助进位标志,若低字节的第4位向上产生一个进位或借位,则AF置“1”,否则置“0”;

          ZF(Zero Flag) — 零标志位, 若运算结果为零, 则ZF置1,否则置0;

          SF(Sign Flag) — 符号标志位,若算数运算的结果为负,SF置1, 否则置0;

          OF(Overflow Flag) — 溢出标志位,有符号数算术运算结果产生溢出, OF置“1”,否则置“0”;

          PF(Pariy Flag) —奇偶标志位,逻辑运算中低8位所含1的个数为偶数则PF置“1” ,否则置“0”;

        • 3个控制标志IF、DF、TF,余下7位保留:

          DF(Direction Flag) —方向标志位

          ​ DF=1 串操作指令以递减顺序处理数据串;

          ​ DF=0 串操作指令以递增顺序处理数据串;

          IF(Interrupt Flag) — 中断允许标志

          ​ IF=1 CPU允许接收外部可屏蔽中断请求,即开中断;

          ​ IF=0 关中断;
          TF(Trace Flag) — 跟踪标志位

          ​ TF=1 处理器处于单步工作方式时,每执行完一条指令产生一个软件中断;

          ​ TF=0 正常工作;

1

  • 编程结构(BIU && EU)工作过程:
  • when 两个字节Bytes为 empty in 指令队列 —->

    CS:IP —-> 取指令(2 Bytes) in 存储器 —->

    存放 指令队列

  • 指令队列 —-> EU

  • 译码分析 in EU控制电路

  • EU控制电路 send 控制信号 ——> 各个部件

  • 各个部件执行

    • (special执行时)访问存储器 data -> 运算后结果存入存储器 :

      EU get 操作数16位地址偏移量 —-> 20位物理地址 in BIU的地址加法器 —->

      data in 存储器 —-> 内部EU数据总线 —-> ALU 计算结果 —->

      20位实际目标地址(同上地址加法器产生) in 存储器

  • 8086引脚信号

    • 预备知识:

      信号特点:引脚功能复用,不工作时8086 device处于高阻状态,总线时分复用

      模式:最小模式(系统中只有一个8086微处理器),最大模式(系统中包含两个或多个微处理器)

      输入RESET == 1,处于复位状态时:

      reset

    • 引脚功能:

      在min最小模式下

      AD15 ~ AD0 (地址/数据复用:双向工作)

      • AD0: 可作为低8位数据的选通信号(when AD0 == 0)
A19/S6,A18/S5,A17/S4,A16/S3                            (地址/状态复用:输出)

$\overline{BHE}$/S7                                                                         (高8位数据总线允许/状态复用:输出)

MN/$\overline{MX}$                                                                         (min/max  模式选择:输入)

$\overline{RD}$                                                                                  (读信号:输出)

HOLD               <=>       $\overline{RQ}/\overline{GT0}$                                (hold request 总线保持请求信号:输出)

HLDA               <=>       $\overline{RQ}/\overline{GT1}$                                (hold acknowledge 总线保持应答信号:输出)

$\overline{WR}$                  <=>       $\overline{LOCK}$                                    (写信号:输出)

M/$\overline{IO}$               <=>       $\overline{S2}$                                             (存储器/输入输出端口控制信号:输出)

DT/$\overline{R}$                <=>       $\overline{S1}$                                             (data transmit/receive 数据收发信号:输出)

$\overline{DEN}$               <=>       $\overline{S0}$                                            (data enable 数据允许信号:输出)

ALE                    <=>       QS0                                         (address latch enable  地址锁存允许信号:输出)

$\overline{INTA}$              <=>       QS1                                         (interrupt acknowledge  中断响应信号:输出)

NMI                                                                                (non-maskable interrupt 非屏蔽中断输入:输入)

INTR                                                                               (interrupt request 可屏蔽中断输入:输入)

$\overline{TEST}$                                                                           (测试信号输入:输入)

READY                                                                            (准备好信号输入:输入)

RESET                                                                             (复位:输入)

CLK                                                                                 (时钟信号输入:输入)

![2](./2_ch2_8086_figure/2.png) 

**在max最大模式下**  :(协处理器:8087专用于数值运算,8089专用于输入输出控制)

$\overline{RQ}/\overline{GT0}$                                                                   (总线请求信号输入:输出)

$\overline{RQ}/\overline{GT1}$                                                                   (总线授权信号:  输出)

$\overline{LOCK}$                                                                       (总线封锁信号:输出)

$\overline{S2}\ \overline{S1}\ \overline{S0}$                                                                   (总线周期状态信号:输出)

QS0,QS1                                                                  (指令队列状态 IQS 信号:输出)
  • 8086 与其他芯片连接(8284A,8282,8286,8259A,8288)

    • 8284A 时钟发生器

      输入:READY信号

      ​ RESET信号

      输出:(发 => 8086的 CLK)

      ​ (发 => 8086的 READY)

      ​ (发 => 8086的 RESET)

  • 8282 地址锁存器

    输入:STB (min模式:8086发出的ALE)

    ​ (max模式:8282发出的ALE)

    ​ $\overline{OE} == 0$

    ​ (8086发出的$\overline{BHE}$)

    ​ (8086发出的 A19 ~ A16,AD15 ~ AD0)

    输出:$\overline{BHE}$

    ​ (发 => 地址总线)

    8282

  • 8286 数据收发器

    输入:$\overline{OE}$(min模式:8086发出的$\overline{DEN}$ ),

    ​ (max模式:8288控制信号 DEN 和8259A发出的控制信号 与非)

    ​ T (min模式:8086发出的 DT/$\overline{R}$)

    ​ (max模式:8288发出的 DT/$\overline{R}$)

    ​ A7 ~ A0 (8086发出的AD7 ~ AD0)

    输出:B7 ~ B0 (发 => 数据总线)

    8286

  • 8259A 中断控制器 (max 模式下)

    输入: (max模式:8288发出的$\overline{INTA}$)

    ​ (max模式:8288发出的$\overline{IORC}$)

    ​ (max模式:8288发出的$\overline{IOWC}$)

    输出:(max模式:8259A发出控制信号) [和 8288控制信号 DEN 与非 => 8286 的 $\overline{OE}$]

    ​ (max 模式:发 => 8086的 INTR)

    interrupt

  • 8288 总线控制器 (max 模式下)

    • 功能:

      1. 主处理器和协处理器协调工作

      2. 总线的共享控制

      3. 对CPU发出控制信号变换和组合:

        对存储器和 I/O 端口的读写信号

        对地址锁存器 (8282) 控制信号

        对数据收发器 (8286) 控制信号

        对中断控制器 (8259A) 控制信号

    输入:CLK (max模式:8284A 时钟发生器的输出)

    ​ $\overline{S0}\ \overline{S1}\ \overline{S2}$ (max模式:8288发出的$\overline{S0}\ \overline{S1}\ \overline{S2}$)

    ​ $\overline{AEN}$,IOB == 0

    ​ CEN == 5V

    输出:ALE (max模式:发 => 8282 的STB)

    ​ DEN (max模式:和 8259A发出控制信号 与非,发 => 8286 的 $\overline{OE}$)

    ​ DT/$\overline{R}$ (max模式:发 => 8286 的 T)

    ​ $\overline{MRDC}$ (max模式:发 => 控制总线) (对存储器的读命令 memory read command)

    ​ $\overline{MWTC}$ (max 模式:发 => 控制总线) (对存储器的写命令 memory write command)

    ​ $\overline{IORC}$ (max模式:发 => 控制总线,8259A中断控制器) (对I/O的读命令)

    ​ $\overline{IOWC}$ (max模式:发 => 控制总线,8259A中断控制器) (对I/O的写命令)

    ​ $\overline{INTA}$ (max模式:发 => 8259A中断控制器) (中断响应信号)

    8288

  • 总连接图

    min 最小模式

    min

    max 最大模式

    max

  • 8086总线操作

    • 周期

      • 时钟周期:计算机主频决定的基本时间计量单位

      • 指令周期:从取指令到执行指令完毕所需的时间

      • 总线周期:外部存储器 or I/O端口 存or取 数据 的时间

        总线的4个状态:T1、T2、T3、T4;有时插入等待状态Tw,空闲状态Ti

        T1:8086(AD15 ~ AD0,A19/S6 ~ A16/S3)发送 存储单元地址

        T2:AD15 ~ AD0低16位成高阻状,A19/S6 ~ A16/S3 发送 总线周期状态

        T3:AD15 ~ AD0 发送 data

        Tw:插入n个附加的时钟周期Tw,直到外设或存储器完成数据传输 => READY == 1,进入T4

        T4:总线周期结束

        Ti:总线处于空闲

  • min && max 模式的 read && write

    • min read

      min_read

      min_read2

      T1:M/$\overline{IO}$ == 1 => memory输入输出,DT/$\overline{R}$ == 0 => data receive, ALE ==1 => address latch enable 地址锁存器enable , $\overline{BHE}/S7$ == 0 => A19/S6 ~ A16/S3不能状态复用,而是传address

      T2: $\overline{BHE}/S7$ == 1 => A19/S6 ~ A16/S3状态复用,ALE ==0 => 无效化 地址锁存器,$\overline{RD}$ == 0 => 可read 数据,$\overline{DEN}$ == 0 => data enable 可传数据

      T3:READY == 0 => 开始传数据

      Tw:继续传数据,直到 READY == 1(CLK上升沿)时停止 =>进入T4

      T4:结束,各信号归位

    • min write

      min_write

    • max read

      max_read

    • max write

      max_write

  • min && max 模式的总线 BUS

    • min 总线BUS保持

      min_BUSkeep

    • max 总线BUS请求,应答

      max_BUSrequest

  • 8086中断

    • 中断类型:

      • 硬件中断:由外部请求引起的中断

        • 可屏蔽中断INTR

          INTR高电平有效 (受IF控制),

          CPU (每条指令的最后一个T状态) 检测INTR =>

          CPU响应中断 => INTA有效 => 读取中断类型码 from 外设

        • 非屏蔽中断NMI (INT 2)

          NMI (上升沿有效) (不受CPU控制),

          中断类型码为2(INT 2)

* 软件中断:由指令执行引起的中断

  * DIV和IDIV指令(INT   0)

    除数为0或商超过寄存器所能表达

  * INT 指令          (INT   n)

    执行INT n指令引起的中断

  * INTO 指令       (INT   4)

    若OF=1,则指令INTO引起类型码为4的软件中断

  * 单步中断         (INT   1)

    若TF=1,则CPU每执行完一条指令后便产生类型码为1的软件中断
  • 中断向量 (4 Bytes)

    中断处理子程序的入口地址:

    中断服务程序偏移地址IP(前 2 Bytes) + 中断服务程序段地址CS(后 2 Bytes)

    eg: INT 21H => 21H * 4Bytes = 84H => 87H ~ 84H 作为 CS:IP

    interrupt_eg

    • 中断向量表

      内存0段:0~3FFH = 4 bytes * 256 (0 ~ 0FFH 共 256 个中断向量)

      0 ~ 4: 专用中断类型

      5 ~ 1FH:保留中断类型 (可修改中断服务程序)[ 其中 8~0FH是8个硬件中断]

      20H~0FFH:用户可用中断类型

      interrupt_chart

  • 中断响应

    • 过程

      软件中断 or NMI中断信号 or INTR中断信号( when CPU允许中断响应: IF=1)

      ==>进入中断响应周期: (4 种情况)

      1. NMI中断信号 => 类型码是2

      2. INTR中断信号(IF = 1) => 外设->低8位AD7 ~ AD0 传送中断类型码 ->CPU [占用两个总线周期]

        • 第一周期用来通知发中断请求的设备,准备好中断类型码;
        • 第二周期接收外设接口发来的中断类型码; (外设在第二个INTA负脉冲时,将中断类型码通过数据总线的低8位传给CPU)
        • M/$\overline{IO}$ == 0,ALE 每个总线周期T1状态输出正脉冲,作为地址锁存信号。

        INTR_code

      3. 中断指令 => 指令中类型码

      4. 程序出错产生中断 => 默认的类型码

      ==>FLAG 压入堆栈,set TF = 0,IF = 0,先压CS后压IP入堆栈

      ==>中断类型码 * 4 = 中断服务程序的入口地址

      ==>转入执行 中断服务程序

      ==>执行后,堆栈弹出 pop 恢复断点处 CS:IP 和 FLAG

      ==>返回执行下一条指令

      interrupt_process

      • 注意:TF=1 处理器处于单步工作方式时,每执行完一条指令产生一个软件中断
  • 8086和8088的区别

    • 8086是16位数据总线,8088是8位数据总线

      在处理16位数据字时:8088需要两步操作,而8086只需要一步

    • 8086内部6字节指令缓冲队列,8088内部4字节指令缓冲队列

    • 8086有M/$\overline{IO}$信号,8088对应为IO/$\overline{M}$