计组与微机控制
6.2 8086CPU状态、锁存与时钟使能
6.2 8086CPU状态、锁存与时钟使能
二、A19/S6 ~ A16/S3:地址/状态复用引脚
第二组是:A19/S6 ~ A16/S3
这也是复用引脚。
1. T1 状态输出高 4 位地址
在 T1 期间,它们输出地址的高 4 位:A19 ~ A16
和 AD15 ~ AD0 输出的低 16 位地址合起来,组成 20 位物理地址:
A19 A18 A17 A16 A15 ... A0
所以 8086/8088 能访问 1MB 空间。
2. T2 ~ T4 状态输出状态信息
在 T2、T3、Tw、T4 状态,这些引脚不再输出地址,而是输出状态信号:S6 ~ S3
这些状态信号告诉外部电路 CPU 当前处于什么状态。
3. S6
S6 为 0,用来表示当前 8086/8088 与总线相连。
一般记忆即可:S6 通常为 0
4. S5
S5 表示中断允许标志 IF 的当前状态。
S5 = 1:当前 IF = 1,允许可屏蔽中断S5 = 0:当前 IF = 0,禁止可屏蔽中断
也就是把 CPU 内部 FLAGS 中 IF 的状态通过引脚反映出来。
5. S4 和 S3:当前使用哪个段寄存器
S4、S3 合起来表示当前正在使用哪个段寄存器。
表 2.4 给出:

S4 | S3 | 含义
0 | 0 | 当前正在使用 ES
0 | 1 | 当前正在使用 SS
1 | 0 | 当前正在使用 CS,或者未使用任何段寄存器
1 | 1 | 当前正在使用 DS这个表主要让外部硬件知道:
CPU 这次访问与哪个段有关。
A19/S6 ~ A16/S3 在 T1 是高位地址,之后是状态信息
BHE/S7 和 A0
这一页非常重要,尤其是表 2.5。它讲的是 8086 如何在 16 位数据总线上区分:
访问低 8 位? 访问高 8 位?访问一个完整的 16 位字?访问偶地址还是奇地址?
核心信号是:BHE 和 A0
一、BHE 是什么?
BHE 全称:Bus High Enable
意思是:高 8 位数据总线允许
注意 BHE 上面有横线,表示低电平有效。
所以:BHE = 0:高 8 位数据总线 AD15~AD8 有效BHE = 1:高 8 位数据总线 AD15~AD8 无效
1. 为什么需要 BHE?
8086 的数据总线是 16 位:AD15 ~ AD0
可以分成两半:低 8 位:AD7 ~ AD0高 8 位:AD15 ~ AD8
内存通常按字节编址。
所以 CPU 有时只访问一个字节,有时访问一个字。
它必须告诉外部:
这次使用低 8 位数据线,还是高 8 位数据线,还是 16 位都用。
这就需要 BHE 和 A0 配合。
二、8086 的内存通常分成两个字节体
为了配合 16 位数据总线,可以把内存想象成两个 8 位存储体:
偶地址存储体:连接 AD7 ~ AD0奇地址存储体:连接 AD15 ~ AD8
也就是说:
偶地址字节走低 8 位数据总线。奇地址字节走高 8 位数据总线。
例如:
地址 0000H → 低 8 位 AD7~AD0地址 0001H → 高 8 位 AD15~AD8地址 0002H → 低 8 位 AD7~AD0地址 0003H → 高 8 位 AD15~AD8
这就是为什么 A0 很重要。
A0 表示地址最低位:
A0 = 0:偶地址A0 = 1:奇地址
三、BHE 和 A0 的组合
表 2.5 是重点。

1. BHE = 0,A0 = 0
含义:从偶地址开始读/写一个字
使用数据引脚:AD15 ~ AD0
因为从偶地址开始的一个字占两个字节:
偶地址:低字节,走 AD7~AD0奇地址:高字节,走 AD15~AD8
所以一次总线周期就能传完整 16 位。
例如从 1000H 读一个字:
1000H:低字节1001H:高字节
1000H 是偶地址,所以可以一次读完。
2. BHE = 0,A0 = 1
含义:从奇地址单元读/写一个字节
使用数据引脚:AD15 ~ AD8
因为奇地址字节连接在高 8 位数据总线上。
例如读 1001H 这个字节:
1001H 是奇地址使用 AD15~AD8
3. BHE = 1,A0 = 0
含义:从偶地址单元读/写一个字节
使用数据引脚:AD7 ~ AD0
因为偶地址字节连接在低 8 位数据总线上。
例如读 1000H 这个字节:1000H 是偶地址使用 AD7~AD0
4. BHE = 1,A0 = 1
含义:无效因为:
BHE = 1 表示高 8 位不用。A0 = 1 表示低 8 位对应的偶地址也不是目标。
两边都没选中,所以无效。
四、为什么奇地址开始的字要两个总线周期?
这是表 2.5 最容易考的点。如果要从奇地址开始读一个字,比如:
从 1001H 读一个字这个字占两个字节:
1001H:低字节1002H:高字节
但问题是:
1001H 是奇地址,连接高 8 位数据总线 AD15~AD8。1002H 是偶地址,连接低 8 位数据总线 AD7~AD0。
这两个字节不在同一个 16 位对齐边界上。
所以不能一次总线周期读完,必须分两次。
1. 第一个总线周期
读地址 1001H 这个字节。
A0 = 1BHE = 0
使用:AD15 ~ AD8
取到这个字的低 8 位。
2. 第二个总线周期
读地址 1002H 这个字节。
A0 = 0BHE = 1
使用:AD7 ~ AD0
取到这个字的高 8 位。
3. 结论
偶地址开始的字:一个总线周期奇地址开始的字:两个总线周期
这和前面学的小端存放正好联系起来。
小端存放说:低地址放低字节 高地址放高字节
如果字从偶地址开始,两个字节刚好分别落在低/高两个存储体上,可以一次取完。如果字从奇地址开始,跨了两个总线周期。
五、8088 中没有 BHE/S7
课本说,在 8088 中,第 34 脚不是 BHE/S7,而是另一个信号。
因为 8088 外部数据总线只有 8 位。
它一次只能传一个字节,不存在“高 8 位数据总线 AD15~AD8”这种情况。
所以 8088 不需要 BHE 来选择高 8 位数据总线。
这也是 8088 和 8086 硬件上的重要区别。
六、NMI:非屏蔽中断引脚
NMI:Non-Maskable Interrupt
非屏蔽中断。
1. NMI 不受 IF 影响
前面讲 FLAGS 时学过 IF:
IF = 1:允许可屏蔽中断IF = 0:禁止可屏蔽中断
但 NMI 是非屏蔽中断。
所以:NMI 不受 IF 控制
即使 IF = 0,NMI 仍然可以被响应。
2. NMI 不能用软件屏蔽
课本说 NMI 不能用软件屏蔽。
它通常用于非常紧急、重要的硬件事件。
比如:
电源故障内存校验错误严重硬件异常
这类事件不能因为程序关中断就不处理。
3. NMI 的触发方式
课本说:当 NMI 引脚端输入一个上升沿触发跳变信号时,CPU 会在结束当前指令后,进入对应的非屏蔽中断处理程序。
8086/8088 中,NMI 对应的中断类型号是:
2
所以:NMI → 类型 2 中断
七、INTR:可屏蔽中断请求引脚
INTR 是:
Interrupt Request
可屏蔽中断请求信号。
1. INTR 受 IF 控制
INTR 和 NMI 不同。
INTR 是可屏蔽中断,所以要看 IF。
CPU 是否响应 INTR,至少要满足:
IF = 1 INTR 引脚为高电平
如果 IF = 0,即使外部设备发出 INTR,CPU 也不会响应。
2. INTR 什么时候被采样?
课本说:
CPU 在执行每条指令的最后一个时钟周期会对 INTR 进行采样。
也就是说,CPU 不会在指令执行到一半时突然停下来处理 INTR。
它通常是:
当前指令执行完检查 INTR如果允许,则响应中断
所以中断响应不是把当前指令切断,而是在指令边界处理。
3. NMI 和 INTR 对比
项目 | NMI | INTR
名称 | 非屏蔽中断 | 可屏蔽中断
是否受 IF 控制 | 不受 | 受 IF 控制
触发 | 上升沿触发 | 高电平请求
用途 | 紧急硬件事件 | 普通外设中断
类型号 | 固定为 2 | 由中断响应过程确定八、RD:读信号引脚
RD 上面有横线,所以它是低电平有效。
RD 是输出信号。
它和 M/IO 配合,表示 CPU 要进行一次读操作。
1. RD = 0 表示读
当 CPU 要从内存或 I/O 端口读数据时,会让 RD 变为低电平。
所以:
RD = 0:读操作有效RD = 1:没有读操作
2. 读内存还是读 I/O,要看 M/IO
但是读的是内存,还是 I/O 端口,要看 M/IO 信号。
大致理解:
M/IO 指出访问对象是 Memory 还是 I/ORD 指出操作方向是 Read
所以组合起来可以表示:
内存读 I/O 读
3. RD 在哪些时钟状态有效?
在一个读操作的总线周期中,RD 在:T2、T3、Tw状态均为低电平。
也就是说:T1 先给地址。T2 开始发读信号。如果设备慢,插入 Tw,RD 继续保持有效。数据准备好后,完成读周期。
九、CLK:时钟引脚
CLK 是 CPU 的时钟输入。
CPU 内部的时序逻辑都要靠时钟节拍工作。
课本说 8086/8088 要求时钟信号占空比为 33%,频率为 5MHz。
这个是特定芯片型号的时钟要求。
CLK 给 CPU 提供工作节拍总线周期 T1、T2、T3、T4 都是由时钟划分出来的
没有时钟,CPU 内部操作就没有统一节奏。
总结一下目前几节学的
1. 实模式下 80386/80486 的地址
实模式地址形成仍类似 8086:物理地址 = 段地址 × 10H + 偏移
但:偏移不能超过 FFFFH 最大可到 10FFEFH
2. 保护模式地址形成
逻辑地址 = 段选择符 + 偏移量段选择符查 GDT/LDT 得到段描述符段描述符给出段基址段基址 + 偏移量 = 线性地址线性地址经过分页转换 = 物理地址
重点句:保护模式下,段寄存器里不是段基址,而是段选择符。
3. GDTR、LDTR、IDTR、TR
GDTR:指向全局描述符表 GDTLDTR:指向局部描述符表 LDTIDTR:指向中断描述符表 IDTTR:指向当前任务状态段 TSS
4. 最小模式和最大模式
最小模式:单处理器,控制信号由 8086/8088 自己产生最大模式:多处理器/协处理器系统,需要更多外部总线控制
协处理器:8087:数值运算 8089:输入/输出
5. AD 复用线
8086:AD15~AD0 地址/数据复用T1 输出地址T2~T4 传数据
8088:
AD7~AD0 地址/数据复用A8~A15 只输出地址
6. A19/S6 ~ A16/S3
T1:输出高 4 位地址 A19~A16T2~T4:输出状态 S6~S3
其中:S5 反映 IFS4S3 表示当前使用哪个段寄存器
7. BHE 和 A0
这是重中之重。
BHE = 0:高 8 位数据总线有效A0 = 0:偶地址A0 = 1:奇地址
组合:
BHE=0, A0=0:偶地址开始访问一个字,用 AD15~AD0BHE=0, A0=1:访问奇地址字节,用 AD15~AD8BHE=1, A0=0:访问偶地址字节,用 AD7~AD0BHE=1, A0=1:无效
结论:偶地址开始的字:一个总线周期 奇地址开始的字:两个总线周期
8. 中断引脚
NMI:非屏蔽中断,不受 IF 影响,类型号 2 INTR:可屏蔽中断,受 IF 控制
9. RD 和 CLK
RD:低电平有效,表示读操作CLK:时钟输入,决定 CPU 工作节拍
这几页最难的是 保护模式地址转换 和 BHE/A0 选择数据总线。可以重点把这两块画图理解,后面做题会经常用。
