第 2 章 微处理器与总线
1. 微处理器概述
(1)程序的执行过程
CPU 的功能:取指令、翻译、取操作数、执行和保存结果。
内存的重要性:执行操作的来源
自动运行的核心:程序控制寄存器 IP
总线的宽度:对计算机的速度有影响
(2)微处理器(CPU)的基本组成:运算器、控制器和寄存器。
(3)8066 和 8088 的区别
8086 总线宽度为 16 位,8088 总线宽度为 8 位(数据总线)。
2. 8088微处理器
(1)8086 / 8088 CPU的内部结构 (考点)
- 执行单元 EU
- 基本构成: 算数逻辑单元(ALU)、8 个通用寄存器、1 个标志寄存器和 EU 控制电路。
- 功能:翻译、执行并临时保存结果。
总线接口单元 BIU
- 基本构成: 20 位的地址加法器、5 个专用寄存器、1 个指令队列和总线接口控制电路。
- 功能:取指令、取操作数并保存结果。
流水线的功能 (考点):
【区别】8086 是 6 个字节,8088 是 4 个字节。
1、两个以上字节空,自动启动取指令(取指令为 FIFO 即先进先出结构)。
2、EU 不和外界打交道,只在指令队列取指令。
3、预取指令队列(指令队列不是固定的),有跳转指令时会更新。
(2)8086 CPU 的寄存器结构
8086 CPU 内部有 14 个 16 位寄存器:通用寄存器(8)、段寄存器(4)和控制寄存器(2)。
通用寄存器
AX | BX | CX | DX |
累加器 | 基址寄存器 | 计数器 | 数据寄存器 |
SI | DI | SP | BP |
源寄存器 | 目的寄存器 | 堆栈指针 | 基址指针 |
专用寄存器
CS | DS | SS | ES | IP | FR |
代码段 | 数据段 | 堆栈段 | 扩展段 | 指令指针 | 标志位寄存器 |
- 标志寄存器 FR: 16 位只用其中 9 位,包括 6 个状态标志和 3 个控制标志。
状态标志位: CF 、PF 、AF 、ZF 、SF 、OF
OF: 溢出标志位。当算数运算超出带符号数的范围,即溢出时 OF = 1 ,否则 OF = 0 。
SF: 符号标志位。当运算结果的最高位为 1 时即负数。
ZF: 零标志位。当运算结果为零时 ZF = 1 ,否则 ZF = 0 。
AF: 辅助进位标志。在加(减)法操作中,如果 D3 向 D4 有进位(借位),则 AF = 1,否则 AF = 0。
PF: 奇偶标志位。当运算结果的低 8 位中 1 的个数为偶数时 PF = 1 ,为奇数时 PF = 0 。
CF: 进位标志。当进行加(减)运算时,若最高位向前有进(错)位,则 CF = 1 ,否则 CF = 0 。
控制标志位: TF 、IF 、DF
标志位记忆方法(一般不用 TF):
奥(OF)迪(DF / IF)死(SF)砸(ZF)P(PF)C(CF)
一般考试会考 O S Z A P C 的状态:
eg.
上面操作完后的标志位状态为:
OF(1): 带符号数的最高位由 0 变为 1 即从正变成负,所以溢出了。
SF(1): 运算结果最高位为 1 即负数。
ZA(0): 结果不为零。
AF(1): D3 到 D4 有进位情况。
PF(1): 低 8 位中 1 的个数为 4 即偶数。
CF(0): 最高位没有进位,如果是带符号数就有进位了。
(3)改标志位
CLI/STI: 改 IF
CLD/STD: 改 DF
CLC/STC: 改 CF
3. 8088 系统的存储器
(1)编码数
位数 | 8 | 16 | 20 |
码数 | 256 (28) | 65536 (216) | 1024K (210 * 210 = 1M) |
(2)储存器的配置
8086 / 8088 特点:1 M 内存 ,地址范围为 00000H - FFFFFH 。
默认为高地址高字节,即小端模式。
大端法: 最高有效字节放在低地址。
小端法: 最低有效字节放在低地址。
字节顺序依赖于机器的类型,小端法一般用的较多,下列是一个十六进制值为 0x1234567 的例子:
地址总线 16 位,内存空间为 64 KB ;地址总线 20 位,内存空间为 220 个单元,即 1 MB 。
地址段的首地址,最后一位为 0H 。
段首址: 段的首地址,最后一位为 0H 。
段基址: 段首址的最高 4 位 H 。
段首址和段基址是等价的。
逻辑地址 = 段基址 : 偏移地址
物理地址(考点) = 段基址 × 16 + 段内偏移 = 段首址 + 偏移地址
eg. 逻辑地址 3A00H : 12FBH 对应的物理地址是 3BFBH 。
最小段为 16 B(例如 XXX10H 和 XXX20H 之间就相差了 16 B),**最大段 **为 64 KB ,并且段是可以重叠的,故逻辑地址不唯一。
注意:
(1)64 KB = 26 KB = 216 B(16 位有 16 个二进制数表示,其中最小为0000 0000 0000 0000,最大为1111 1111 1111 1111)
(2)1 KB = 1024 字节也就是 Bytes(B) ,1 Byte = 8 bit
(3)64 KB = 65536 比特
(4)段寄存器的使用
代码段(程序段)—— CS : IP
数据段 —— DS : BX ,DI ,SI
堆栈段 —— SS : SP ,BP
eg. 若 CS = 8000H,则当前代码段可寻址的储存空间范围是 80000H ~ 8FFFFH 。
因为段基址 8000H 转换成段首址要乘以 16 即十六进制左移 1 位,得到 80000H 。又因为最大段为 64 KB 即 216 B ,所以最大填满段首址的低 4 位即 8FFFFH 。
8086/8088 的启动单元:0FFFF0H
(5)堆栈 - 特殊储存区
SP 初值指向栈底,向上生成。
eg. 若已知 SS = 1000H ,SP = 2000H ,则堆栈的段首地址为 10000H ,栈顶地址(初值在栈底)为 12000H 。将数据 1234H 压入堆栈后,1234H 所在的内存单元的地址为 11FFEH 。
专门指令操作:
PUSH: SP - 2
POP: SP + 2
SP 始终指向栈顶
对字操作: FIFO结构(先进后出)
4. 管脚和总线
(1)8088 总线
总线要包含片选信号,以及三态门装置。
储存单元是用地址访问的。
总线的分类:
地址总线: 20 条 —— 单向
数据总线: 16 条(8086)、8 条(8088)—— 双向
控制总线: #RD ,#WR ,IO/#M 至少 3 条(有些地方会写成等价的 4 条,#MEMR ,#MEMW ,#IOR ,#IOW)
8086 和 8088 的区别总结 (考点):
(1)数据总线 8086 是 16 条,8088 是 8 条。
(2)流水线 8086 是 6 个字节,8088 是 4 个字节。
(3)8086 的 IO 高低电平相反,IO 是低电平,高电平是 M 即 #IO/M 。而 8088 是 IO/#M 。
(2)8088 的管脚功能
8088 的管脚解复用技术:
第一周期: ALE 下降沿所存地址信号形成稳定的地址总线。
第二周期: #DEN,DT/#R 控制形成稳定的数据总线。
主要控制状态线:
IO/#M: 输出。指出当前访问存储器还是访问I/O。注意8086是M/#IO。
#WR: 输出。写命令信号。
#RD: 输出。读命令信号。
ALE: 输出。高电平表示AB地址有效;此信号在T1状态有效。
#DEN: 输出。低电平时表示DB上的数据有效。
DT/#R: 输出。数据传送方向。
READY : 输入。准备就绪信号。由外部输入;用于解决CPU与慢速存储器或I/O电路的同步问题。
(3)最小系统
在最小系统中,还需加入:
8284(时钟发生器): 1 片
8282(地址的锁存器): 3 片
8286(数据的缓冲器即收发器): 1 片(8088)/ 2 片(8086)
5. 8086/8088 CPU 工作时序
(1)基本概念
时钟周期: 若 8086/8088 的主频为 5 MHZ ,一个时钟周期为200 ns 。
总线周期(机器周期): CPU 完成对储存器或 I/O 一次访问所需的时间。
指令周期: 执行一条指令需要的时间。
空闲周期(Ti): 微处理器 BIU 空闲时,总线上插入的时间。
等待周期(Tw): 总线周期内,储存器或 I/O 没有准备好数据时插入的时间。
(2)基本时序
典型的总线周期:一个总线周期一般由四个 T 组成。T1 :输出地址,T2 及 T3:传送数据。
指令周期大概在两个微秒:10 * 200 ns = 2 us
存储器读时序
第 1 周期: ALE 下降沿锁存地址。
第 2 周期: #DEN ,#RD 有效。
第 3 周期: 检测 ready 信号是否有效,若发现其为低,则在T3周期结束后,插入一个 Tw(等待周期) 状态。以后在每个 Tw 周期的前沿采样 READY 线,只有在发现它为高电平时,才在这个 Tw 结束后进入T4周期。
第 4 周期: #DEN ,#RD 无效。
存储器写时序
其写时序与读时序的区别是,写时序没有 ready 即没有等待周期,数据发出快。