# 8086/8088CPU计算机系统

> 万年第一章，计算机概述。前面计算机原理已经和清楚了，这里把最核心的拿出来再说说。

这一章首先介绍了计算机组成和基本工作原理，然后从内部结构和电路结构两个方面介绍了8086/8088CPU。内部结构是从程序员角度来看处理器结构，这一部分还介绍了寄存器作用、存储器组织方式。电路结构从芯片级别介绍8086/8088CPU，包括工作模式、引脚功能。最后分析了了典型工作时序。

## 1. 微机组成与基本工作原理

微型计算机由**微处理器（CPU）、存储器、I/O接口、总线**几部分组成。

粗略地讲，各部分用总线连接起来（总线是连接多个功能部件或多个装置的一组公共信号线）。总线按照功能分为**地址总线、数据总线、控制总线**。

冯·诺依曼提出的计算机的核心工作原理是**不断地从存储器取指令然后执行**。两个词概括就是**程序存储**和**程序控制**的概念

**程序存储**是指将事先编制好由指令序列组成的程序存放到存储器中；**程序控制**是指逐条地从存储器中取出指令并完成指令所指定的操作。

执行每一条指令，都包括**取指、译码、执行**三个基本步骤。计算机工作的过程就是不断的取指、译码、执行的过程。更细致的讲是**取指令、指令译码、取操作数、执行运算、送结果**。

## 2. 8086/8088CPU编程结构

<figure><img src="/files/xgYZC71nVcZCUsrwpyAV" alt="" width="400"><figcaption><p>编程结构</p></figcaption></figure>

编程结构（功能结构）是程序员比较关注的，由\*\*执行部件(Execution Unit)**和**总线接口部件(Bus Interface Unit)\*\*组成。

执行部件包括**ALU、通用寄存器、状态寄存器**等，主要负责指令的执行与算术运算、逻辑运算。

总线接口部件包括**段寄存器、地址加法器、指令指针、指令队列缓冲器、输入输出控制电路**。BIU主要负责与存储器、IO接口数据传输。

二者协同工作（不同步），在EU执行指令时，BIU取得下一条或几条指令放入指令队列，EU执行完前一条指令后从指令队列取出下一条指令执行，提高了CPU效率。

一些细节：

* BIU中的指令队列：8086为6字节，空两字节填满。8088为4字节，空一字节填满。
* 地址加法器用来产生20位地址，在存储结构里会说这个问题

CPU内部的寄存器：

* 数据寄存器：AX，BX，CX，DX
* 段寄存器：CS、DS、SS、ES
* 指针寄存器：BP，SP，IP
* 变址寄存器：SI，DI
* 标志寄存器：PSW

<figure><img src="/files/bDMprchBtQbTIhiINl6O" alt="" width="380"><figcaption><p>标志寄存器</p></figcaption></figure>

标志寄存器内部有6个**状态标志位**与3个**控制标志位**：

* CF（Carry）：进位标志。加法最高位进位或减法最高位出现借位CF=1。
* PF（Parity）：奇偶标志位。结果的低8位中1个数为偶数PF=1。
* AF（Auxiliary）：半进位标志位。结果的低4位产生借位或进位。
* ZF（Zero）：运算结果为0，ZF=1。
* SF（Sign）：带符号数为负，SF=1。
* TF（Trap）：单步执行标志位。TF=1单步指令执行。
* IF（Interrupt）：中断允许标志位。IF=1响应可屏蔽中断。（STI，CTI指令可以设置）
* DF（Direction）：方向标志位。DF=1数据串指令递减处理。（STD，CTD）
* OF（Overflow）：带符号数算术运算结果超出带符号数能表达的范围

## 3. 存储器组织方式

指令与数据放在存储器里，CPU通过地址找到存储器里的指令。8086/8088有找到1MB存储空间内的数据的能力，但是1MB是20bit，作为一个16bitCPU，还需要一些小操作才能实现20bit的寻址能力。

8086/8088CPU对外地址20位（有20根地址线），内部寄存器都是16位，存储器组采用分段结构，将1MB存储空织间分成许多逻辑段，每个逻辑段有64KB存储空间，一个存储单元除具有一个唯一的物理地址外，还具有多个逻辑地址。例如，程序执行地址表示方式为CS:IP（物理地址=段基地址：段内地址），以启动地址为例，运算方式为`物理地址 = (CS × 16) + IP`。

8086系统中，多字节数据存放为**低址低位、高址高位**。用低地址表达数据地址。在“地址对齐”的情况下，可以获得较高的存取速度。地址对齐：字（2Byte）安排在偶地址（xxx0B）、双字（4Byte）安排在模4地址（xx00B）。

## 4. 8086/8088CPU引脚功能与工作模式

### 4.1 引脚功能

<figure><img src="/files/VpQwMcvhhqw4jMgjRP54" alt="" width="200"><figcaption><p>8086引脚</p></figcaption></figure>

<figure><img src="/files/dymSywHkQf4TSookY18B" alt="" width="200"><figcaption><p>8088引脚</p></figcaption></figure>

引脚功能这里对主要的做个介绍，对照着典型时序图深入理解

* $$\color{#ff00ff} NMI$$ 不可屏蔽中断输入信号。正跳变触发。
* $$\color{#ff00ff} INTR$$可屏蔽中断输入。高电平触发。
* $$\color{#ff00ff} HOLD$$ 总线请求保持。申请总线到占用总线期间始终保持HOLD高电平有
* $$\color{#ff00ff} HOLDA$$总线保持响应表示CPU已响应总线请求并已将总线释放
* $$\color{#ff00ff} DT/R$$数据发送/接收表明当前总线上数据的流向
* $$\color{#ff00ff} DEN$$数据允许，有效时当前数据总线上正在传送数据，可利用他来控制对数据总线的驱动。
* $$\color{#ff00ff} READY = 0$$通过该信号达到快速的CPU与慢速的存储器之间的同步，T3插入等待周期。使用协处理器8087时，该引脚和WAIT指令，可使8088与8087的操作保持同步
* $$RESET$$热启动维持4个周期，冷启动开机维持50
* $$\color{#ff00ff} A\_{19}/S\_{6} - A\_{16}/S\_{3}$$：访问存储器时，T1为$$\color{#ff00ff} A\_{19} - A\_{16}$$，访问外设T1为低电平无效。

8086/8088CPU引脚为分时复用，因此需要根据控制信号对地址锁存，数据缓冲，常用的一些芯片：

* 三态门数据缓冲器：74LS244（单向）；74LS245（双向）；8286（双向）；
* D触发器（地址锁存）：74LS273（异步清零）；74LS373（带缓冲三态锁存）；8282（带缓冲三态锁存）；

### 4.2 工作模式

8086/8088有最小模式和最大模式。\
在最小模式下 $$\color{#ff00ff} {MN}/\overline{MX} = 1$$ ，控制总线信号直接由CPU引脚发出，系统中存储器容量较小，外设端口较少，系统总线控制逻辑较简单。

<figure><img src="/files/OHS29ez3jbUPX2grgodV" alt="" width="260"><figcaption><p>最小模式连接</p></figcaption></figure>

在最大模式下 $$\color{#ff00ff} {MN}/\overline{MX} = 0$$ ，控制总线信号需要经过总线控制器转换后形成，可以构成更大规模的系统，存储器容量较大，外设端口也多。

<figure><img src="/files/K0yOIPG33v8nM2Ftsjef" alt="" width="260"><figcaption><p>最大模式连接</p></figcaption></figure>

IBM5150地址锁存使用74LS373，总线控制器8288；时钟信号发生器8284A。IBM5150数据缓冲使用芯片74LS245，书上用8286；

<figure><img src="/files/JiAk3K277rtyvuxjoldP" alt="" width="500"><figcaption><p>常用芯片</p></figcaption></figure>

8086是一个真16位CPU，内外数据总线都是16位 $$\color{#ff00ff} {AD}*{15} - AD\_0$$ ，一个总线周期可以读一个字节，也可以读一个字。 $$\color{#ff00ff} BHE$$ 为高字节允许，仅在 $$\color{#ff00ff} T\_1$$ 时出现，需要和数据一起锁存。8086系统可以使用该信号将存储器分为奇偶两个存储体，偶存储体的数据送至 $$\color{#ff00ff} D\_7 - D\_0$$ ，奇存储体的数据送至 $$\color{#ff00ff} D*{15} - D\_8$$ 。

<figure><img src="/files/qVHl58Q3OFshzYZzWRHh" alt="" width="300"><figcaption><p>奇偶存储体</p></figcaption></figure>

## 5. 8086/8088CPU最小模式典型工作时序

在了解电路层次上的系统构成后再分析典型工作时序，先要熟悉周期的概念，然后结合引脚功能和最小模式进一步深入理解CPU的工作原理。

周期与时序的概念：计算机的每一个操作都是由时钟信号 $$\color{#ff00ff} CLK$$ 来触发的，脉冲方波信号是计算机运行的最小节拍。三个层次的周期：**时钟周期（Clock Cycle）**、**总线周期（BUS Cycle）**、**指令周期（Instruction Cycle）**。

指令周期为执行一条指令需要的时间，总线周期为读或写一个字节需要的时间，时钟周期是CLK的倒数。

时钟周期又称T状态，基本总线周期有4个T状态，一指令周期由几个总线周期构成。典型时序有：

* 存储器读写与 I/O端口读写（输入输出）
* 中断响应
* 系统复位（启动）
* 总线占用

这里分类分成了4个，存储器读写与IO读写可拆开算2个，或者把读和写也拆开算成4个。那么总共就是5个或7个。

### 5.1 存储器与IO读写时序

分析要点：从 $$T\_1 - T\_4$$的顺序，按照时序图从上到下：

* T1状态， $$M / IO$$ 指示读存储器/IO端口， $$A\_{19} - A\_0$$ 地址线送出地址信号， $$ALE$$ 送出地址锁存信号，其他引脚送出相应信号。（送地址信号）
* T2状态， $$A\_{19} - A\_{16}$$ 送出状态， $$AD\_7 - AD\_0$$ 浮空（输出时送数据）， $$RD/WR$$ 状态， $$DEN$$有效。（送控制信号）
* T3状态：数据读入 $$AD\_7 - AD\_0$$ ，若T3前检测到 $$READY = 0$$ 插入 $$Tw$$ ，
* T4状态：CPU采样数据线，其他引脚信号失效。

<figure><img src="/files/qWiXjBgI7IPzZqQyxzST" alt="" width="300"><figcaption><p>存储器或IO读时序</p></figcaption></figure>

<figure><img src="/files/LhMKR2DvaUURPEOh2IId" alt="" width="300"><figcaption><p>存储器或IO写时序</p></figcaption></figure>

### 5.2 中断响应时序

分析要点：①中断产生的条件，②描述时序图，③两次信号的含义。

* ①当有外部中断源发出中断请求时（NMI 或 INTR），CPU在执行完当前指令之后，进入中断响应周期。可屏蔽中断`IF = 1`时中断才会得到响应。
* ②中断响应周期有两个总线周期组成。每个中断响应周期各发出一个INTA中断响应信号。
* ③第一个INTA信号通知申请中断的外设CPU准备响应中断。第二个INTA信号后，外设把中断类型码送给CPU（通过低8位数据线）。CPU根据此类型码来得到中断向量，以便得到中断服务程序的入口地址。

<figure><img src="/files/XQJtjmneC7EP7wqCFY2Z" alt="" width="400"><figcaption><p>中断响应时序</p></figcaption></figure>

### 5.3 系统复位（启动）时序

分析要点：①复位条件，②时序描述，③复位结果（各寄存器、引脚状态）：

* ①外部复位信号有效， $$RESET$$ 出现上升沿，CPU停止工作直到信号变低。 $$RESET$$ 保持至少4个周期，上电复位保持至少50us。
* ②时钟 $$CLK$$ 的上升沿同步外部复位信号到内部复位。总线浮空，控制信号先变高（无效状态）再浮空。
* ③复位后，除`CS=0FFFFH`，其他寄存器都是0，指令队列空。

<figure><img src="/files/ctT3GPe6K5CJplUn9g3A" alt="" width="330"><figcaption><p>系统复位时序</p></figcaption></figure>

### 5.4 总线保持（总线占用）时序

HOLD引脚有效，提出总线占用请求，CPU释放总线后回应HLDA信号通知外设接管总线。

<figure><img src="/files/BB0wEjaQkO4cnT8ljFhO" alt="" width="330"><figcaption><p>总线保持时序</p></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://embedded.xym.work/1_3_organization/4_8086/1pc-yu-cpu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
