8088/8086微处理器与总线学习笔记总结
一、微处理器与总线
1.微处理器的概述
首先要记得微处理器(CPU)是由下面三个部件组成的:
运算器、控制器、寄存器组,其中,寄存器组可以看成是运算器部件中的一个部分。
微处理器(CPU)是计算机系统的核心部件,控制和协调着计算机系统的工作。
1.1 运算器
运算器由算术逻辑单元ALU、通用或专用寄存器组及内部总线3个部分组成。
运算器核心功能是:实现数据的算术运算和逻辑运算。
其中算术逻辑单元ALU的内部包括负责加、减、乘、除运算的加法器以及实现与、或、非、异或运算的逻辑功能部件。
运算器可分为单总线结构、双总线结构和三总线结构。
1.2 控制器
控制器主要的功能是控制程序的执行,是整个系统的指挥中心。
它有如下的几个功能:
1.2.1 指令控制
根据指令所在的地址按顺序或在遇到转移指令时按照转移地址取出指令,分析指令(指令译码),传送必要的操作数,并在指令结束后存放运算结果。
1.2.2 时序控制
指令的执行是在时钟信号的严格控制下进行的,一条指令的执行时间称为指令周期,不同的指令的指令周期是不一样的,而机器周期中包含多少个节拍也是不一样的,这些时序信号用于计算机的工作基准。
1.2.3 操作控制
操作控制是根据指令,确定在指令周期的各个节拍中要产生的微操作控制信号,以便完成各条指令的操作过程。
控制器内部主要由下面几个部分组成:
1.程序计数器PC
用来存放下一条要执行的指令在存储器中的地址
2.指令寄存器IR
存放待执行的指令
3.指令译码器ID
将指令进行翻译
4.时序控制部件
产生计算机工作所需的各种时序信号
5.微操作控制部件
二、8086/8088微处理器
其中重点说的是8086CPU。
8086和8088是同时代的微处理器,都属于第三代CPU,具有完全系统的指令系统,但是8088的外部总线宽度为8位,8086的数据总线的宽度为16为。但是它们内部的总线宽度都是为16位的。
1.8086/8088CPU的指令特点
1.1 指令流水线
在程序的执行过程中,CPU都是按照下面的顺序来执行的:
1.取出下一条指令
2.分析指令(译码)
3.读操作数(根据需要)
4.执行指令(包括算术逻辑运算、I/O操作、数据传送、控制转移)
5.写结果(根据需要)
8088/8086的内部电路大致分为两大部件:执行单元(EU)和总线接口单元(BIU)。
执行单元EU负责分析指令和执行指令。
总线接口单元BIU负责取指令、取数据和写结果。
两个单元能够独立地完成各自相应的工作,在大多数情况下,取指令操作和执行指令操作可以重叠进行。重叠进行就是一个并行流水线。
1.2 内存的分段管理技术
将8086/8088内部分为多个逻辑段,每个逻辑段最大为64K,为每个段设置段地址和偏移地址。
1.3 支持多处理器系统
在8086/8088中有一个引脚可以控制工作模式为最小或者最大方式。
最小模式:单处理器模式,所有信号又8086直接产生,不支持DMA。
最大方式:多处理器模式,能支持系统中的多个处理器,由总线控制器辅助提供控制信号。
2.8088/8086的外部引脚及其功能
两个CPU的外部引脚都差不多一样,但是还是一些地方有所不同,比如34号引脚,28号引脚
34号引脚。86是BHE#/S7
,而88是SS0#
,对于86来说,34号引脚主要是控制AD0~AD15
的使用情况的,但是单考这个引脚是不可以的,还要结合A0
引脚
BHE# | A0 | 描述 | 启动引脚 |
---|---|---|---|
0 | 0 | 两个字节 | AD15 ~AD0 |
0 | 1 | 奇地址高位 | AD15 ~AD8 |
1 | 0 | 偶地址低位 | AD7 ~AD0 |
而88的SS0
引脚与IO/M#
和DT/R#
信号决定了最小模式下当前总线周期的状态:
IO/M# | DT/R# | SS0# | 操作 |
---|---|---|---|
1 | 0 | 0 | 发中断响应信号 |
1 | 0 | 1 | 读IO端口 |
1 | 1 | 0 | 写IO端口 |
1 | 1 | 1 | 暂停 |
0 | 0 | 0 | 取指令 |
0 | 0 | 1 | 读内存 |
0 | 1 | 0 | 写内存 |
0 | 1 | 1 | 无作用 |
可以发现,如果是读的操作,那SS0
都是非有效位,但是写或者是取的操作,那么SS0
就是有效的。
28号引脚中,8088和8086虽然看起来相同,但是它们高低电频的有效是不一样的
CPU | IO/M=0 | IO/M=1 |
---|---|---|
8086 | IO | M |
8088 | M | IO |
A16/S3
~A19/S6
是地址状态复用的引脚,三态输出。
其中S3
~S6
是状态信号线,S6
恒等于0,S5
指示中断允许标志位IF的状态,S4
和S3
的组合指示CPU当前正在使用的段寄存器:
S4 | S3 | 当前正在使用的段寄存器 |
---|---|---|
0 | 0 | ES |
0 | 1 | SS |
1 | 0 | CS或未使用任何段寄存器 |
1 | 1 | DS |
AD0
`AD7`和`AD8`AD15
,其中8088只有0到7。这是地址、数据分时复用的双向信号线,也是有三态。
其中,当ALE
引脚为高电平时,这些引脚上传输的是地址信号;当DEN#
为低电平时,这些引脚上传输的是数据信号。
WR#
这个引脚是写信号输出,三态,当这个引脚输出低电平时,表示CPU正在对存储器或者IO口进行写操作。
DT/R#
表示数据传送方向控制信号:
电平 | 执行的操作 |
---|---|
1 | CPU向存储器或IO接口发送数据 |
0 | 存储器或IO接口向CPU发送数据 |
ALE
引脚是地址锁存器信号,当它有效时,表明CPU地址线上有有效信号。
DEN#
数据允许信号。
RD#
读选信号,当有效时,表明CPU正在读取存储器或者IO接口。
READY
外部同步控制输入信号,这个位置是又外部被访问的内存或IO设备发出的相应信号,当有效时,表示IO设备或存储器准备就绪。如果没有准备好,CPU的T3周期采样READY
信号,若还是一直没准备好,那CPU会自动插入等待周期Tw,这个Tw一个或者多个,直到READY
就绪。
INTR
可屏蔽中断请求输入信号。
TEST#
测试信号输入引脚。
NMI
非屏蔽中断请求输入信号。
RESET
系统复位输入信号,这个信号需要在4个时钟周期保持有效才能进行复位,复位后CPU内部段寄存器的状态如下:
内部寄存器 | 内容 |
---|---|
CS | FFFFH |
DS | 0000H |
ES | 0000H |
SS | 0000H |
IP | 0000H |
FLAGS | 0000H |
其余寄存器 | 0000H |
指令队列 | 空 |
当RESET
信号有效后,8086CPU的启动地址为FFFF0H。
INTA#
中断响应信号输出,当CPU对中断请求信号INTR
的响应,这个引脚有效。
HOLD
总线保持请求信号输入。
HOLA
总线保持响应输出。
CLK
时钟信号输入引脚。
上面都是最小系统的时候,因为考试只考最小系统的引脚,所以这里重点讲的就是最小系统,最大系统不考。
3.8086/8088的功能结构
这主要讲的是内部的执行单元EU和总线接口单元BIU的一些概念和CPU内部的一些寄存器组还要标注寄存器FLAGS,很重要。
3.1内部结构
86和88内部极为相似,但也有不同,88的指令队列只有4位,而86的指令队列有6位,其余的都是相同的。
上面的是88的内部结构
下面的是86的内部结构,可以看到,出来指令队列的长度以外,其余的都是一样的。
总线接口单元BIU主要实现CPU与存储器或IO接口之间的数据传送,它由地址加法器、段寄存器、总线控制逻辑、指令队列以及内部暂存寄存器组成。
执行单元EU主要的功能是:执行指令、分析指令、暂存中间运算结果并保留结果的特征,它由通用寄存器、暂存寄存器、算术逻辑单元ALU、标志寄存器FLAGS和EU控制部件组成。
他们工作如下:
1.EU从执行队列中取出指令后,指令队列出现空字节时,那么BIU就自动执行一次取指令周期,讲取出来的指令放入指令队列中。
2.如果EU需要数据时,BIU根据EU提供的地址从给定的地址去寻找出数据供EU进行使用。
3.运算结束后,BIU会将需要的数据送入指定的内存单元或外设中。
4.如果指令队列为空,EU需要进行等待,直到有指令为止。
5.当BIU正在取指令,EU发出访问总线的请求,则必须等BIU取指令完毕后该请求才能得到响应。
3.2 内部寄存器
88和86都有14个16位的寄存器,按照功能可以分为:通用寄存器、段寄存器、控制寄存器。
3.2.1 通用寄存器
通用寄存器又分为数据寄存器、地址指针寄存器和变址寄存器。
数据寄存器有4个:
寄存器名 | 名称 | 通常用法 |
---|---|---|
AX | 累加器 | 用来存放算术逻辑运算的操作数,一般IO指令都使用累加器与外设接口来传送信息 |
BX | 基址寄存器 | 常用来存放访问内存时的基地址 |
CX | 计数寄存器 | 在循环和串操作指令中用作计数器 |
DX | 数据寄存器 | 在寄存器间接寻址的IO指令中存放IO端口的地址 |
这4个寄存器都可以拿来存放数据,只不过它们有各自的使用习惯,就是那些用法,用特点的功能使用的速度会很快。
而数据寄存器可以分为两个8位的寄存器:
寄存器名1 | 寄存器名2 | 名称 |
---|---|---|
AH | AL | 累加器 |
BH | BL | 基址寄存器 |
CH | CL | 计数寄存器 |
DH | DL | 数据寄存器 |
地址指针寄存器只有两个,SP和BP
寄存器名 | 名称 | 用法 |
---|---|---|
SP | 堆栈指针寄存器 | 永远指向堆栈的栈顶 |
BP | 基址指针寄存器 | 一般存放内存的基地址,通常和SS(堆栈段寄存器)一起使用 |
它们两个也可以存放数据,但是一般用来存放内存的地址。
变址寄存器只有两个,DI和SI:
寄存器名称 | 名称 | 用法 |
---|---|---|
DI | 目的变址寄存器 | 索引指针 |
SI | 源变址寄存器 | 索引指针 |
3.2.2 段寄存器
寄存器名 | 名称 |
---|---|
CS | 代码段寄存器 |
DS | 数据段寄存器 |
SS | 堆栈段寄存器 |
ES | 附加段寄存器 |
3.2.3 控制寄存器
寄存器名称 | 名称 |
---|---|
IP | 指令指针寄存器 |
FLAGS | 标志寄存器 |
IP指针寄存器中用来存放预取指令的偏移地址。
FLAGS标志寄存器是一个16位的寄存器,但只能使用其中的9位,这9位中有6个状态标志位和3个控制标志,状态和控制标志位如下:
标志位 | 名称 | 用法 |
---|---|---|
CF | 进位标志位 | 当CF=1时,则表示最高位向前有进(借)位 |
AF | 辅助标志位 | 当AF=1时,则表示D3向D4有进(借)位。 |
PF | 奇偶标志位 | 当运算结果的低8位中1的个数为偶数时,PF=1。 |
SF | 符号标志位 | 如果运算的结果是正数,那SF=0。 |
ZF | 零标志位 | 如果运算的结果为0,则ZF=1。 |
OF | 溢出标志位 | 当运算的结果超出了范围,那么OF=1。 |
控制位 | 名称 | 用法 |
---|---|---|
IF | 中断允许标志位 | IF=1时,使CPU可以响应可屏蔽中断请求。 |
TF | 陷阱标志位 | TF=1时,激活CPU的调试特性,使CPU处于单步执行指令的方式。 |
DF | 方向标志位 | DF=1,按照减地址方式进行,从高地址开始,每进行一次操作,地址减一。DF=0,按照增地址方式进行,从低地址开始,每进行一次,地址增1。 |
3.3 存储器组织
3.3.1 存储器地址空间
86和88的储存是以字节为地位组织的,它们具有20条地址线,可寻址的存储器空间为220,每个字节对应一个唯一的地址,地址范围为0~220 - 1。
存储器存取的基本单元为字节,存储器内两个连续的空间称为一个字,也就是2个字节=1个字,字的低位字节存放在低地址中,高字节存放在高地址中,字的地址为低字节的地址,各位的编号从0开始。
86允许字从任何地址开始,如果字的地址为偶地址时,也就是用偶数的地址开始,称字的储存是对准的,访问一个对准的字需要一个总线周期。
如果字的地址为奇地址开始,那么称这个字是非对准的字,访问一个非对准的字需要两个总线周期。
3.3.2 物理地址和逻辑地址
88和86外部有20根地址线,可以访问220的内存,但是在内部只有16根地址总线,只能访问216的内存,如果要让它能访问2^20的内存,88和86采用了地址空间分段的方法来解决做个问题,就是将1M空间分为若干个64K的段,然后用基地址加上偏移地址来访问物理存储器。
各逻辑段的起始地址的最低4位必须为0.
为了得到一个物理地址,需要使用下面的公式来计算:
物理地址=段地址*16+偏移地址
段地址和偏移地址的组合又称为逻辑地址,表示形式为:xxxxH:yyyyH
,其中xxxxH
是段地址,yyyyH
是偏移地址。
比如有下面的逻辑地址:3A00H:12FBH,那么它指向的物理地址为:3B2FBH。
3.3.3 段寄存器的使用
分段的话也可以将信息按照特征进行分段处理,按照信息特征可分为:
- 数据段--用来存放数据和运算结果
- 代码段--用来存放程序的指令代码
- 堆栈段--用来传递参数、保持数据和状态信息
- 附加段--用来存放数据和运算结果
对于访问不同的内存段所使用的段寄存器和偏移地址的来源有一些具体约定:
内存访问类型 | 默认段寄存器 | 可重设寄存器 | 段内偏移地址的来源 |
---|---|---|---|
取指令 | CS | 无 | IP |
堆栈操作 | SS | 无 | SP |
串操作之源串 | DS | ES、SS | SI |
串操作之目标串 | ES | 无 | DI |
BP用作基址寻址 | SS | ES、DS | 按寻址方式计算得到有效地址 |
一般数据存取 | DS | ES、SS | 按寻址方式计算得到有效地址 |
各段的起始位置由程序员指出,可以彼此分离,也可以首位相连、重叠或部分重叠。
3.4 工作时序
时序可分为两种不同的粒度:时钟周期和总线周期。
一条指令的执行需要若干个总线周期才能完成,而一个总线周期又由若干个时钟周期构成。
微处理器在运行过程中是按照一个统一的时钟一步一步的执行每一个操作的,每个时钟脉冲的持续时间就称为一个时钟周期,时钟周期越短,CPU执行速度越快。
一个典型的总线周期基本包含4个时钟周期。
一个总线周期=4个时钟周期
总线周期是指在总线系统中传输数据的时间周期。
指令周期是指计算机处理器执行一条指令的全过程。
机器周期是指完成一个基本操作所需要的时间。
指令周期、总线周期和时钟周期的区别和关系:
系统主时钟一个周期信号所持续的时间称为时钟周期(T);
微处理器通过外部总线对存储器或I/O端口进行一次读写操作的过程称为总线周期;
微处理器执行一条指令的时间(包括取指令和执行指令所需的全部时间)称为指令周期;
关系:一个总线周期由若干个时钟周期组成;一个指令周期由若干个总线周期组成
4.总线
4.1 概述
总线是一组信号线的集合,是计算机系统各部件中间传输地址、数据和控制信息的公共通路。
总线包括一组导线和相关控制、驱动电路组成,每一条导线都能传输一位二进制信息。
总线上连接的部件过多时,会减低信号响应的实时性。
4.2 总线的分类
总线可以按照传输的类型和层次结构来分类。
总线按照传输信息的类型可分为:数据总线DB、地址总线AB、控制总线CB。
按照层次结构可分为:前端总线、系统总线和外设总线。
4.3 总线的结构
总线结构可分为两种:单总线结构和多总线结构。
单总线结构是将计算机的各个部件均挂接到一条总线上,这种接法的优点是控制简单、扩充方便,缺点是数据传输的效率和速度收到了限制。
多总线结构又分为:双总线结构、多总线结构。
双总线结构又分为面向CPU的双总线结构和面向存储器的双总线结构。
面向于CPU的双总线结构:
面向于存储器的双总线结构:
4.4 总线的操作
总线操作的特点:任意时刻,总线上只能允许一对设备(主控设备和从属设备)进行信息交换。
总线周期可分为5个步骤:
- 总线请求
- 总线仲裁
- 寻址
- 传送数据
- 传送结束
4.5 总线的主要性能指标
- 总线带宽
- 总线位宽
- 总线的工作频率
4.6 总线的基本功能
- 总线传输同步
- 总线仲裁控制
- 出错处理
- 总线驱动