8086 微处理器及其外设主要功能
一、8086 微处理器
1 功能结构(编程结构)
1.1 总线接口单元(BIU)
组成:段寄存器、指令指针寄存器、内部通信寄存器、6Byte指令队列、20bit地址加法器、总线逻辑控制电路
功能:负责读取指令;完成储存器、I/O端口的读写
1.2 执行单元(EU)
组成:通用寄存器阵列、标志寄存器、算术逻辑单元、暂存器、控制与定时部件
功能:负责指令的译码和执行
2 寄存器阵列
BIU 中的:
- CS(Code Segment):代码段寄存器
- DS(Data Segment):数据段寄存器
- SS(Stack Segment):堆栈段寄存器
- ES(Extra Segment):附加段寄存器
- IP(Instruction Pointer):指令指针寄存器
EU 中的:
- AX(Accumulator):累加器
- BX(Base):基数寄存器
- CX(Count):计数寄存器
- DX(Data):数据寄存器
- SP(Stack Pointer):堆栈指针寄存器
- BP(Base Pointer):基址指针寄存器
- SI(Source Index):源变址寄存器
- DI(Destination Index):目的变址寄存器
- FR(Flag Register):标志寄存器
3 主要引脚及其功能
3.1 $\mathrm{AD}_{15} \sim \mathrm{AD}_0$
时分复用:
- 在 $T_1$ 周期,输出存储器或I/O端口地址
- 在 $T_2 \sim T_4$ 周期,传输数据
3.2 $A_{19}/S_6 \sim A_{16}/S_3$
- 在 $T_1$ 周期用作地址线高 4 位
- 在其他周期用来表示中断允许状态和段寄存器
$S_6$ :0 - 表示CPU占用总线
$S_5$ :1 - 表示允许可屏蔽中断;0 - 表示禁止可屏蔽中断
$S_4S_3$ :00 - 正在使用 ES ;01 - 正在使用 SS ;10 - 正在使用 CS ;11 - 正在使用 DS
3.3 $\overline{\mathrm{BHE}}/S_7$
$\overline{\mathrm{BHE}}$(Bus High Enable):
0 - 表示高8位数据线 $D_{15} \sim D_8$ 有效;
1 - 表示高8位数据线 $D_{15} \sim D_8$ 无效。
$\overline{\mathrm{BHE}}$ | $A_0$ | 状态 |
---|---|---|
0 | 0 | 16位数据($D_{15} \sim D_0$) |
0 | 1 | 高8位数据($D_{15} \sim D_8$) |
1 | 0 | 低8位数据($D_7 \sim D_0$) |
1 | 1 | 保留 |
3.4 $\overline{RD}$
0 - 表示读取数据
3.5 READY
准备就绪信号线(输入)
0 - 表示存储器或I/O设备未就绪,需要等待
1 - 表示存储器或I/O设备已就绪,可以传送数据
在总线时钟 $T_3$ 的上升沿检查 READY 信号,若 READY=0 ,则需要插入 $T_w$ ;
之后的每一次上升沿都检查 READY 信号,直到 READY=1 时结束插入 $T_w$ ,进入 $T_4$ 状态。
3.6 INTR
Interrupt Request
在每个指令周期的最后一个T状态进行采样,如果为高电平,则进入中断相应周期。
可用软件屏蔽( CLI
指令):设置 IF 标志位为 0
3.7 NMI
Non-Maskable Interrupt
上升沿触发
一旦检测到上升沿,则在当前指令结束后立即进入中断服务程序
不能用软件屏蔽(IF标志位无效)
3.8 $\overline{\mathrm{TEST}}$
在执行 WAIT
指令时,8086 检测 $\overline{\mathrm{TEST}}$ 信号。
若 $\overline{\mathrm{TEST}}$ 为低电平,则 8086 继续执行 WAIT
下一条指令,否则进入空闲状态,直到 $\overline{\mathrm{TEST}}$ 变为低电平。
3.9 RESET
复位信号
当RESET为高电平并且持续4个时钟周期时,CPU进行复位
复位后的寄存器数值为:
CS=FFFFH
DS=0000H
SS=0000H
ES=0000H
IP=0000H
FR=0000H(禁止可屏蔽中断)
4 最小模式($MN/\overline{MX}=1$)下的引脚及其功能
4.1 $M/\overline{IO}$
$M/\overline{IO}=1$ ,访问存储器(MEM)
$M/\overline{IO}=0$ ,访问 I/O 端口
4.2 $\overline{WR}$
表示CPU处于写MEM或者I/O的状态
4.3 $\overline{INTA}$
中断响应信号
当CPU响应中断后,$\overline{INTA}$ 产生持续两个时钟周期的低电平
4.4 ALE
地址锁存允许信号(Address Latch Enable)
在 $T_1$ 状态时,ALE 引脚让地址锁存器 8282/8283 锁存地址总线上的地址信号。
4.5 $TD/\overline{R}$
数据收发信号
控制总线收发器8286/8287的数据传送方向。
$TD/\overline{R}=1$ ,发送
$TD/\overline{R}=0$ ,接收
4.6 $\overline{DEN}$
数据使能信号
作为总线收发器8286/8287的允许信号
4.7 HOLD(输入) HLDA(输出)
其它设备发送HOLD信号给8086请求总线的控制权;
CPU通过HLDA信号作为HOLD信号的应答信号,同时让出总线控制权。
5 最大模式($MN/\overline{MX}=0$)下的引脚及其功能
最小模式 | 最大模式 |
---|---|
$M/\overline{IO}$ | $\overline{S_2}$ |
$TD/\overline{R}$ | $\overline{S_1}$ |
$\overline{DEN}$ | $\overline{S_0}$ |
$\overline{WR}$ | $\overline{LOCK}$ |
$\overline{INTA}$ | $QS_1$ |
$ALE$ | $QS_0$ |
$HOLD$ | $\overline{RQ}/\overline{GT_0}$ |
$HLDA$ | $\overline{RQ}/\overline{GT_1}$ |
5.1 $\overline{S_2}$,$\overline{S_1}$,$\overline{S_0}$
$\overline{S_2}$ ,$\overline{S_1}$ ,$\overline{S_0}$ 接总线控制器 8288 ,用来产生所有有关存储器访问或 I/O 访问所需要的控制信号。
$\overline{S_2}$,$\overline{S_1}$,$\overline{S_0}$ | 状态 |
---|---|
000 | 中断响应 |
001 | 读I/O端口 |
010 | 写I/O端口 |
011 | 暂停 |
100 | 取指令 |
101 | 读存储器 |
110 | 写存储器 |
111 | 无源状态 |
5.2 $\overline{RQ}/\overline{GT_0}$,$\overline{RQ}/\overline{GT_1}$
这两个信号提供给外部的主控设备,用于请求并得到总线控制权。
$\overline{RQ}/\overline{GT_0}$ 比 $\overline{RQ}/\overline{GT_1}$ 有更高的优先权。
5.3 $\overline{LOCK}$
当 $\overline{LOCK}$ 信号为低电平时,告诉外部的总线主控设备不能获得对系统总线的控制权。
该信号由前缀指令“LOCK”使其有效,且一直保持到下一条指令完成以前。
在总线响应期间,CPU将它置为高阻态。
5.4 $QS_1$,$QS_0$
指令队列状态信号反映了处理器内部指令的执行情况,设置这两个引脚的目的是让外部的设备能监视CPU内部的指令队列,这样可以让协处理器8087进行指令的扩展处理。
$QS_1$,$QS_0$ | 含义 |
---|---|
00 | 无操作 |
01 | 来自队列中指令代码的第一个字节 |
10 | 队列空 |
11 | 来自队列的后续字节 |
6 标志寄存器
序号 | 标志位 | 英文 | 中文 |
---|---|---|---|
1 | CF | Carry Flag | 进位标志 |
2 | PF | Parity Flag | 奇偶标志 |
3 | AF | Auxiliary Carry Flag | 辅助进位标志 |
4 | ZF | Zero Flag | 零标志 |
5 | SF | Sign Flag | 符号标志 |
6 | TF | Trap Flag | 陷阱标志 |
7 | IF | Interrupt-enable Flag | 中断允许标志 |
8 | DF | Direction Flag | 方向标志 |
9 | OF | Overflow Flag | 溢出标志 |
- CF:无符号计算在最高位产生了进位或借位时,CF=1;反之,CF=0
- PF:算术逻辑运算的结果中低8位“1”的个数为偶数个时,PF=1;为奇数时,PF=0
- AF:在运算过程中,第四位向第五位有进位或借位时,AF=1;反之,AF=0
- ZF:当运算结果全零时,ZF=1;反之,ZF=0
- SF:当运算结果为正数,即结果的最高位为0时,SF=0;反之,即结果的最高位为1时,SF=1
- TF:当TF=1时,CPU进入单步工作方式;当TF=0时,正常执行程序
- IF:当IF=1时,CPU可以响应外部可屏蔽中断请求;当IF=0时,CPU不响应外部可屏蔽中断请求。但IF对不可屏蔽中断或内部中断没有影响
- DF:当DF=0时,以地址增量的顺序处理数据串;当DF=1时,以地址减量的顺序处理数据串
- OF:带符号数运算结果超出了补码所能表示的范围,OF=1;反之,OF=0。OF=最高位进位与次高位进位的异或
7 堆栈
8086 的堆栈指针 SP 随着入栈数据的增加而减小。
每次入栈/出栈操作是一个字=2Byte
入栈时,数据字的高8位存入[SP-1]中,低8位存入[SP-2]中,然后令SP=SP-2。
出栈时,数据字的低8位是[SP],高8位是[SP+1],然后令SP=SP+2。
SP的初始值就是堆栈的最大容量。
8 DOS功能调用
8.1 显示字符
MOV DL, 要显示字符的ASCII码
MOV AH, 02H
INT 21H
8.2 显示字符串
MOV DX, OFFSET STRING ; 要显示字符串的首地址(字符串要以'$'结束)
MOV AH, 09H
INT 21H
8.3 输入字符并回显
MOV AH, 01H
INT 21H
; AL储存键入字符的ASCII码
8.4 输入字符但不回显
MOV AH, 08H
INT 21H
; AL储存键入字符的ASCII码
8.5 输入字符串
MOV DX, OFFSET BUFFER
MOV AH, 0AH
INT 21H
; DS:DX指向内存缓冲区
; 缓冲区第一个字节由用户设置最大输入字符数(1~255,含回车符)
; 缓冲区第二个字节是实际输入的字符数(回车符除外)
; 缓冲区第三个字节开始是输入缓冲区字符的ASCII码
8.6 程序终止退出
MOV AH, 4CH
INT 21H
8.7 获取日期
MOV AH, 2AH
INT 21H
; 年——CX;月——DH;日——DL
8.8 设置日期
MOV CX, 年
MOV DH, 月
MOV DL, 日
MOV AH, 2BH
INT 21H
; 设置成功AL=0,否则AL=0FFH
8.9 设置时间
; 8时15分20.5秒
MOV CH, 时(8)
MOV CL, 分(15)
MOV DH, 秒整数部分(20)
MOV DL, 秒小数部分(50)
MOV AH, 2DH
INT 21H
; 设置成功AL=0,否则AL=0FFH
8.10 获取时间
MOV AH, 2CH
INT 21H
; 将时间送入CX和DX寄存器,位置同8.9设置时间
二、8282 地址锁存器
引脚及其功能
1 STB
选通信号(Strobe)
与ALE信号线相连。在ALE由高到低的下降沿处把地址锁存。
2 $\overline{OE}$
输入允许信号
$\overline{OE}=1$ ,锁存器输出高阻态
$\overline{OE}=0$ ,锁存器将数据输出到数据线上
三、8286 双向总线驱动器
增加处理器的带负载能力
引脚及其功能
1 $A_7 \sim A_0$和$B_7 \sim B_0$
数据线
2 $T$
控制收发方向的输入控制信号
$T=1$ ,$A \rightarrow B$
$T=0$ ,$B \rightarrow A$
3 $\overline{OE}$
$\overline{OE}=1$ ,输出高阻态
$\overline{OE}=0$ ,输出数据
四、8288 总线控制器
8086工作于最大组态时需要用到8288总线控制器。 8288根据8086的状态信号 $\overline{S_2}$ 、$\overline{S_1}$ 、$\overline{S_0}$ 的组合判定 CPU 要执行何种操作,发出相应的控制命令。
总线控制器的输出信号相当于控制总线。
五、8289 总线仲裁器
当有多个主控者要求使用系统总线时,由8289总线仲裁器进行仲裁,将总线的使用权给优先级别高的主控者。
8289和8288配合使用,使8086CPU在多处理机系统中方便地与系统总线相连。