3.1 80x86微处理器简介
80x86微处理器是美国Intel公司生产的系列微处理器。从8086开始到目前已进入第五代微处理器:8086(8088)、80286、80386、80486和80586(Pentium、PentiumⅡ~Ⅳ)。其主要发展特点是:
1.主频从8086的4.77MHz到80586的166MHz,PentiumⅡ~Ⅳ更高,可达3GHz。主频是指芯片所使用的主时钟频率,它直接影响计算机的运行速度。
2. 数据总线从8086的16位到80586的64位。数据总线是计算机中组成各部件间进行数据传送时的公共通道。其位数(宽度)表示CPU的字长,数据总线位数越多,数据交换的速度越快。
3.地址总线从8086的20根到80586的32根。地址总线是在对存储器或I/O端口进行访问时,传送由CPU提供的要访问的存储单元或I/O端口的地址信息总线,其宽度决定了处理器能直接访问的主存容量大小。
4.高速缓冲存储器Cache的使用,大大减少了CPU读取指令和操作数所需的时间,使CPU的执行速度显著提高。从80386以后增加了高速缓冲存储器Cache。
微机系统增加了高速缓冲存储器后,使系统的存储器体系形成三级组织结构,即由高速缓冲存储器Cache、主存和外存组成。如图3.1所示。
关于cache
为了解决对存储器要求容量大,速度快,成本低三者之间的矛盾,目前通常采用多级存储器体系结构,即使用高速缓冲存储器、主存储器和外存储器。
名 称 |
简称 |
用 途 |
特 点 |
高速缓冲存储器 |
Cache |
高速存取指令和数据 |
存取速度快,但存储容量小 |
主存储器 |
主存 |
存放计算机运行期间的大量程序和数据 |
存取速度较快,存储容量不大 |
外存储器 |
外存 |
存放系统程序和大型数据文件及数据库 |
存储容量大,位成本低 |
局部性原理
所以,层次结构的存储器系统,可以将最近访问过的内容放入Cache,将近期访问过内容所属的整个块放入Cache。
Cache的引入
引入cache的原因:
因此,在主存和CPU之间可设置一个速度很快而容量相对较小的存储器,在其中存放CPU当前正在使用以及一个较短的时间内将要使用的程序和数据,这样,可大大加快CPU访问存储器的速度,提高机器的运行效率。
80x86CPU在发展过程中,存储器的管理机制也发生了较大变化。
8086/8088CPU:分段实方式
80286CPU:分段实方式、保护方式(可提供虚拟存储管理和多任务管理机制)。
80386~80586CPU:分段实方式、保护方式、虚拟8086方式(可同时模拟多个8086处理器工作)。
虚拟存储管理:为用户提供一个比实际主存空间大得多的程序地址空间,从而可使用户程序的大小不受主存空间的限制。
多任务管理:可允许多个用户或一个用户的多个任务同时在机器上运行。
3.2 8086/8088微处理器
指令预取队列(IPQ)
指令的一般执行过程:
取指令 指令译码 读取操作数
执行指令 存放结果
串行工作方式:1) CPU访问存储器(存取数据或指令)时要等待总线操作的完成
2)CPU执行指令时总线处于空闲状态
缺点:CPU无法全速运行
解决:总线空闲时预取指令,使CPU需要指令时能立刻得到
并行工作方式:8086如何实现并行工作方式
8086微处理器为了充分使用总线以提高程序的执行速度被设计成为两个独立的功能部件:执行部件(EU)和总线接口部件(BIU)。
总线接口部件由段寄存器、指令指针、地址形成逻辑、总线控制逻辑和指令队列等组成。
BIU与外部总线连接为执行部件EU完成所有的总线操作,并计算形成20位的内存物理地址。
负责完成CPU与存储器(内存或主存)或I/O设备之间的数据传送。
① 取指令到指令队列缓冲器
② 从内存或外设端口读取数据
③ 向内存或外设端口发送数据
④ 形成20位物理地址
俗称完成“外勤”工作。
段寄存器(SegmentRegister)
8086系统中把可直接寻址的1MB内存空间分为称作“段”的逻辑区域,段的段地址由称为“段寄存器”的4个16位寄存器决定:
(1) 代码段寄存器CS(16位)
(2) 堆栈段寄存器SS(16位)
(3) 数据段寄存器DS(16位)
(4) 附加段寄存器ES(16位)
指令指针寄存器IP(16位)
指令指针IP是一个16位专用寄存器,它指向当前需要取出的指令字节,当BIU从内存中取出一个指令字节后,IP就自动指向下一条指令。
地址加法器的作用
逻辑地址和物理地址
⑴ 逻辑地址:由段地址(逻辑段起始地址的高16位)和偏移地址(16位)表示的存储单元的地址称为逻辑地址,记为:
段地址∶偏移地址
⑵ 物理地址:由CPU内部总线接口单元BIU中的地址加法器根据逻辑地址产生的20位存储单元地址称为物理地址。
指令队列缓冲器
指令指针IP是一个16位专用寄存器,它指向当前需要取出的指令字节,当BIU从内存中取出一个指令字节后,IP就自动指向下一条指令。
执行单元EU执行部件EU由通用寄存器、标志寄存器、运算器(ALU)和EU控制系统等组成。
① 向BIU提供所需要访问的内存或I/O端口的地址,
② 对通用寄存器、标志寄存器和指令操作数进行管理。
从指令队列中取指令代码 --> 译码-->
在ALU中完成数据的运算 --> 运算结果
的特征保存在标志寄存器FLAGS中。
偏移地址和段寄存器的默认关系
3.38086/8088的寄存器、存储器和I/O组织
一、 8086/8088寄存器结构
在8086/8088微处理器中可供程序员使用的有14个16位寄存器,这14个寄存器按其用途可分为通用寄存器、指令指针、控制寄存器和段寄存器等4类。
1. 通用寄存器
有8个通用寄存器,可分为两组。
(1)数据寄存器。
① 累加器 AX(16位)→AH、AL(高、低各8位)
② 基址寄存器BX(16位)→BH、BL(高、低各8位)
③ 计数寄存器CX(16位)→CH、CL(高、低各8位)
④ 数据寄存器DX(16位)→DH、DL(高、低各8位)
数据寄存器的特点是,这4个16位寄存器可分为高8位(AH、BH、CH和DH)与低8位(AL、BL、CL和DL),这两组8位寄存器可分别寻址、独立操作。
(2) 指针寄存器和变址寄存器。另外4个通用寄存器是:
① 堆栈指针SP(16位)
② 基址指针BP(16位)
③ 源变址寄存器SI(16位)
④ 目的变址寄存器DI(16位)
这4个16位寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址。
2. 控制寄存器
(1)指令指针寄存器IP(16位)
指令指针IP是一个16位专用寄存器,它指向当前需要取出的指令字节,当BIU从内存中取出一个指令字节后,IP就自动指向下一条指令
(2) 标志寄存器FLAG(16位)
8086/8088有一个16位的标志寄存器FLAGS,在FLAGS中有意义的有9位,其中6位是状态位:CF、PF、AF、ZF、SF、OF,3位是控制位:TF、IF、DF。
标志寄存器(Flags)
状态标志:表示处理器当前运行的状态。
CF(Carry Flag)——进位标志,当进行加减运算时,若最高位发生进位或错位,则CF为1,否则为0。该标志通常用于判断无符号数运算结果是否超出了计算机所能表示的无符号数的范围
AF(Auxiliary Flag)——辅助进位标志,低4位向前有进(借)位,AF=1
ZF(Zero Flag)——零标志,若当前运算结果为0,ZF=1
SF(Sign Flag)——符号标志,最高位的值为1时,SF=1
OF(Overflow Flag)——溢出标志,当运算结果超出了带符号数所能表示的数值范围,即溢出时,OF=1。该标志位通常用来判断带符号数运算结果是否溢出
PF(Parity Flag)——奇/偶标志,运算结果低8位中1的个数为偶数个,PF=1
控制标志:控制处理器的某一特定功能。
IF——可屏蔽中断允许标志,IF=1表示允许
DF——方向标志,DF=0地址增量变化;DF=1地址减量变化
TF——陷阱标志(单步执行标志)
标志寄存器举例
最高位向前没有进位,CF=0
低8位中偶数为4个, PF=1
低4位向前有进位, AF=1
运算结果不为0, ZF=0
最高位=1, SF=1
次高位向前有进位, OF=Cs Cp=1(∵Cs=0,Cp=1)
二、8086微处理器的引脚功能
8086微处理器是Intel公司的第三代微处理器—16位微处理器,它采用40引脚的DIP(双列直插)封装。时钟频率有3种:5MHz(8086)、8MHz(8086-1)和10MHz(8086-2)。
1.引脚功能说明
8086的40条引脚信号按功能可分为4部分—地址总线、数据总线、控制总线以及其他(时钟与电源)。
引脚分类引脚定义的方法可大致分为::
地址总线和数据总线(20条)
电源地线及时钟
控制总线(16条)
控制总线是传送控制信号的一组信号线,有些是输出线,用来传输CPU送到其他部件的控制命令(如读、写命令,中断响应等);有的是输入线,由外部向CPU输入控制及请求信号(复位、中断请求等)。
工作方式和RESET
中断相关的引脚
读写内存的信号
低:I/O接口,高:内存;
最小工作方式
其余引脚
3. 最小方式与最大方式
⑴ 最小方式下的基本配置
当8086CPU的MN/MX引脚接+5V电源时,8086CPU工作于最小方式,用于构成小型的单处理机系统。在这种方式中,除8086CPU以及信息传送对象存储器和I/O接口电路外,还有三部分支持系统工作的器件:时钟发生器、地址锁存器和数据收发器。⑵最大方式下的基本配置
当8086CPU的MN/MX引脚接地时,8086CPU工作于最大方式,用于构成多处理机和协处理机系统。同最小方式下8086系统配置相比较,最大方式系统增加了一片专用的总线控制芯片8288。三、8086微处理器的总线时序
1.总线时序
⑴ 指令周期
每条指令的执行由取指令、译码和执行等操作组成,执行一条指令所需要的时间称为指令周期(InstructionCycle),不同指令的指令周期是不等长的,一个指令周期由一个或若干个总线周期组成。
⑵ 总线周期
8086CPU与外部交换信息总是通过总线进行的。CPU的每一个这种信息输入、输出过程所需要的时间称为总线周期(BusCycle),一般一个总线周期由四个时钟周期组成。
⑶ 时钟周期
时钟脉冲的重复周期称为时钟周期(ClockCycle)。时钟周期是CPU的时间基准,由计算机的主频决定。如8086的主频为5MHz,1个时钟周期就是200ns。
2. 几种基本时序
⑴ 总线读操作时序
当8086CPU 进行存储器或I/O端口读操作时,总线进入读周期。基本的读周期由4个时钟周期组成:T1、T2、T3和T4。CPU在T3到T4之间从总线上接收数据。当所选中的存储器和外设的存取速度较慢时,则在T3和T4之间将插入1个或几个等待周期TW。图3.3是8086最小方式下的总线读操作时序图。下面对图中表示的读操作时序进行说明。
⑵ 总线写操作时序
总线写操作就是指CPU向存储器或I/O端口写入数据。图3.4是8086在最小模式下的总线写操作时序图。
总线写操作时序与总线读操作时序基本相同,但也存在以下不同之处:
(a) 对存储器或I/O端口操作的选通信号不同。总线读操作中,选通信号是RD,而总线写操作中是WR。
(b)在T2状态中,AD15~AD0上地址信号消失后,AD15~AD0的状态不同。总线读操作中,此时AD15~AD0进入高阻状态,并在随后的状态中保持为输入方向;而在总线写操作中,此时CPU立即通过AD15~AD0输出数据,并一直保持到T4状态中。
⑶ 中断响应操作时序
当8086CPU的INTR引脚上有一有效电平(高电平),且标志寄存器IF=1,则8086CPU在执行完当前的指令后响应中断,在响应中断时CPU执行两个中断响应周期。图3.5是8086在最小模式下的中断响应操作时序图。
CPU的中断响应周期包括两个总线周期,在每个总线周期中都从INTA端输出一个负脉冲,其宽度是从T2状态开始持续到T4状态的开始。第一个总线周期的INTA负脉冲,用来通知中断源,CPU准备响应中断,中断源应准备好中断类型码,在第二个总线周期的INTA负脉冲期间,外设接口(一般经中断控制器)应立即把中断源的中断类型码送到数据线的低8位AD7~AD0上。
二、8086/8088存储器组织
1.存储器组织
8086/8088微处理器有20条地址线,可以配置1MB的内存储器。存储空间都按8位(即字节)进行组织,每个存储单元存储一个字节数据,若存放“字”数据(16位),则存放在相邻两个存储单元中,高字节存放在高地址单元,低字节存放在低地址单元。每个存储单元都有一个20位的地址,这1 M个存储单元对应的地址为00000H~FFFFFH,如图3.10所示。
一个存储单元中存放的信息称为该存储单元的内容。
如00001H单元的内容为9FH,记为:(00001H)=9FH。
如从地址0011FH开始的两个连续单元中存放一个字型数据,则该数据为DF46H,记为:(0011FH)=DF46H。
8086的1M存储空间实际上分为两个512KB的存储体,又称存储库,分别叫高位库和低位库。
地址总线A19~A1可同时对高、低位库的存储单元寻址,A0和BHE用于对库的选择。
当A0=0时,选择偶数地址的低位库;
当BHE=0时,选择奇数地址的高位库;
当两者均为0时,则同时选中高低位库。
需注意的是,对于规则字(从偶数地址开始存放的字)的读/写操作只需一个总线周期,而非规则字(从奇数地址开始存放的字)的读/写操作需两个总线周期。
图3.14 从8086存储器的偶数和奇数地址读字节和字
(c) 读偶地址单元中的字; (d) 读奇地址单元中的字
2. 存储器分段
8086/8088CPU中有关可用来存放地址的寄存器如IP、SP、SI、DI、BP等都是16位的,故只能直接寻址64KB。为了对1M个存储单元进行管理,8086/8088采用了段结构的存储器管理方法。
8086/8088将整个存储器分为许多逻辑段,但只有4种类型:代码段、数据段、堆栈段和附加段。每个逻辑段的容量小于或等于64KB,允许它们在整个存储空间中浮动。各个逻辑段之间可以紧密相连,也可以互相重叠(局部重叠和完全重叠),还可以相互隔开。
3. 逻辑地址和物理地址
⑴ 逻辑地址:由段地址(逻辑段起始地址的高16位)和偏移地址(16位)表示的存储单元的地址称为逻辑地址,记为:
段地址∶偏移地址
⑵ 物理地址:由CPU内部总线接口单元BIU中的地址加法器根据逻辑地址产生的20位存储单元地址称为物理地址。如图3.7所示。
物理地址和逻辑地址的关系为:
物理地址=段地址×10H+偏移地址
在程序设计中,段地址是由段寄存器(如CS、DS、SS或ES)提供,偏移地址通常是由地址寄存器(如IP、BX、BP、SP、SI或DI等)及立即数等提供。
对于任何一个物理地址来说,可以唯一被包含在一个逻辑段中,也可以包含在多个重叠的逻辑段中,只要能得到它所在段的首地址和段内的相对地址,就可以对它进行访问。即一个物理地址可以对应多个逻辑地址。
4.堆栈操作
8086/8088系统中的堆栈使用段定义语句在存储器中定义的一个堆栈段,和其它逻辑段一样,它可以在1M字节的存储空间中浮动,其容量可达64KB,这是一个具有“先进后出”特性的存储区域,且属于向下生长的堆栈。
堆栈由SS和SP来寻址。SS给出堆栈段的段地址,而SP给出当前栈顶(偏移地址),即指出从段地址到栈顶的偏移量。
若已知当前SS=1050H,SP=0008H,AX=1234H,则8086系统中堆栈的入栈和出栈操作如下图所示。三、8086/8088I/O组织
8086/8088系统和外部设备之间是通过I/O接口电路来联系的。每个I/O接口都有一个或几个端口。在微机系统中每个端口分配一个地址号,称为端口地址。一个端口通常为I/O接口电路内部的一个寄存器或一组寄存器。
8086/8088CPU用地址总线的低16位作为对8位I/O端口的寻址线,所以8086/8088系统可访问的8位I/O端口有65536(64K)个。两个编号相邻的8位端口可以组成一个16位的端口。
8086CPU对I/O设备的读写与对存储器的读写操作类似。当CPU与偶地址的I/O设备实现16位数据的存取操作时,可在一个总线周期内完成;当CPU与奇地址的I/O设备实现16位数据的存取操作时,要占用两个总线周期才能完成。
1.简述8086/8088CPU中BIU和EU的作用,并说明其并行工作过程。
答:(1) BIU的作用:计算20位的物理地址,并负责完成CPU与存储器或I/O端口之间的数据传送。
(2) EU的作用:执行指令,并为BIU提供所需的有效地址。
(3) 并行工作过程:当EU从指令队列中取出指令执行时,BIU将从内存中取出指令补充到指令队列中。这样就实现了取指和执行指令的并行工作。
2.8086/8088CPU内部有哪些寄存器?其主要作用是什么?
答:8086/8088CPU内部共有14个寄存器,可分为4类:数据寄存器4个,地址寄存器4个,段寄存器4个和控制寄存器2个。其主要作用是:
(1) 数据寄存器:一般用来存放数据,但它们各自都有自己的特定用途。
AX(Accumulator)称为累加器。用该寄存器存放运算结果可使指令简化,提高指令的执行速度。此外,所有的I/O指令都使用该寄存器与外设端口交换信息。
BX(Base)称为基址寄存器。用来存放操作数在内存中数据段内的偏移地址,
CX(Counter)称为计数器。在设计循环程序时使用该寄存器存放循环次数,可使程序指令简化,有利于提高程序的运行速度。
DX(Data)称为数据寄存器。在寄存器间接寻址的I/O指令中存放I/O端口地址;在做双字长乘除法运算时,DX与AX一起存放一个双字长操作数,其中DX存放高16位数。
(2) 地址寄存器:一般用来存放段内的偏移地址。
SP(Stack Pointer)称为堆栈指针寄存器。在使用堆栈操作指令(PUSH或POP)对堆栈进行操作时,每执行一次进栈或出栈操作,系统会自动将SP的内容减2或加2,以使其始终指向栈顶。
BP(Base Pointer)称为基址寄存器。作为通用寄存器,它可以用来存放数据,但更经常更重要的用途是存放操作数在堆栈段内的偏移地址。
SI(Source Index)称为源变址寄存器。SI存放源串在数据段内的偏移地址。
DI(Destination Index)称为目的变址寄存器。DI存放目的串在附加数据段内的偏移地址。
(3) 段寄存器:用于存放段地址
CS(Code Segment)称为代码段寄存器,用来存储程序当前使用的代码段的段地址。 CS的内容左移4位再加上指令指针寄存器IP的内容就是下一条要读取的指令在存储器中的物理地址。
DS(Data Segment)称为数据段寄存器,用来存放程序当前使用的数据段的段地址。 DS的内容左移4位再加上按指令中存储器寻址方式给出的偏移地址即得到对数据段指定单元进行读写的物理地址。
SS(Stack Segment)称为堆栈段寄存器,用来存放程序当前所使用的堆栈段的段地址。堆栈是存储器中开辟的按“先进后出”原则组织的一个特殊存储区,主要用于调用子程序或执行中断服务程序时保护断点和现场。
ES(Extra Segment)称为附加数据段寄存器,用来存放程序当前使用的附加数据段的段地址。附加数据段用来存放字符串操作时的目的字符串。
(4) 控制寄存器
IP(Instmcdon Pointer)称为指令指针寄存器,用来存放下一条要读取的指令在代码段内的偏移地址。用户程序不能直接访问IP。
FLAGS称为标志寄存器,它是一个16位的寄存器,但只用了其中9位,这9位包括(个状态标志位和3个控制标志位。它用来反映算术运算和逻辑运算结果的一些特征,或用来控制CPU的某种操作。
3.8086/8088CPU中有哪些寄存器可用来指示操作数在存储器中某段内的偏移地址?
答:可用来指示段内偏移地址的寄存器共有6个:IP、SP、BP、BX、SI、DI
4.8086/8088CPU中标志寄存器FLAGS有哪些标志位?它们的含义和作用如何?
答:标志寄存器中的标志共有9个,分为两类:状态标志6个和控制标志3个。其作用是:
(1) 状态标志:用来反映算术和逻辑运算结果的一些特征。
CF(Carry Flag)—进位标志位。当进行加减运算时,若最高位发生进位或借位,则CF为1,否则为0。该标志位通常用于判断无符号数运算结果是否超出了计算机所能表示的无符号数的范围。
PF(Parity Flag)—奇偶标志位。当指令执行结果的低8位中含有偶数个1时,PF为1,否则为0。
AF(Auxiliary Flag)—辅助进位标志位。当执行一条加法或减法运算指令时,若结果的低字节的低4位向高4位有进位或借位,则AF为1,否则为0。
ZF(Zero Flag)—零标志位。若当前的运算结果为0,则ZF为1,否则为00
SF(Sign Flag)—符号标志位。当运算结果的最高位为1时,SF=1,否则为00
OF(Overflow Flag)—溢出标志位。当运算结果超出了带符号数所能表示的数值范围,即溢出时,OF=1,否则为0。该标志位通常用来判断带符号数运算结果是否溢出o
(2)控制标志位:用来控制CPU的操作,由程序设置或清除。它们是:
TF(TrapFlag)—跟踪(陷阱)标志位。它是为测试程序的方便而设置的。若将TF置1,8086/8088CPU处于单步工作方式,否则,将正常执行程序。
IP(Interrupt Flag)—中断允许标志位。它是用来控制可屏蔽中断的控制标志位。若用STI指令将IF置1,表示允许CPU接受外部从INTR引脚上发来的可屏蔽中断请求信号;若用CLI指令将IP清0,则禁止CPU接受可屏蔽中断请求信号。IF的状态对非屏蔽中断及内部中断没有影响。
DF(DirectionFlag)—方向标志位。若用STD将DF置1,串操作按减地址方式进行,也就是说,从高地址开始,每操作一次地址自动递减;若用CLD将DF清0,则串操作按增地址方式进行,即每操作一次地址自动递增。
5.8086/8088CPU的地址总线有多少位?其寻址范围是多少?
答:8086/8088地址总线有20根,寻址范围1MB
6.什么叫指令队列?8086/8088CPU中指令队列有什么作用?其长度分别是多少?
答:(1) 指令队列:采用“先进先出”原则,按顺序存放预执行指令的缓冲器称为指令队列。
(2) 指令队列的作用:存放EU将要执行的指令,使CPU的取指和执行指令能并行工作。
(3) 指令队列的长度:8086为6个字节,8088为4个字节。
7.Intel8086与8088有何区别?
答:8086与8088的区别有三处:
(1) 外部数据总线位数不同(即地址/数据分时复用引脚条数不同);
8086为16位:AD15~AD0 。
8088为 8位:AD7~AD0 。
(2) 内部指令队列缓冲器长度不同;
8086有6个字节。当指令队列出现2个空字节时,BIU将取指补充。
8086有4个字节。当指令队列出现1个空字节时,BIU将取指补充。
(3) 外部某些控制总线定义不同。
① 8086的28号引脚定义为M/IO(S2),8088定义为IO/M(S2)
② 8086的34号引脚定义为BHE/S7,8088定义为SS0/(HIGH)
8.简述8086 CPU使用地址锁存信号ALE将地址A15~A0与数据D15~D0分开的工作原理。
答:在任何一个总线周期的T1状态,ALE均为高电平,以表示当前地址/数据复用线上的输出的是地址信息,在ALE由高变低的下降沿时把地址装入地址锁存器,而在T2、T3和T4状态,ALE均为低电平,以表示当前地址/数据复用线上的输出的是数据信息,此时通过数据收发器进行传送。
9.什么是逻辑地址?什么是物理地址?若已知逻辑地址为BA00:A800,试求物理地址。
答:逻辑地址:由段地址和偏移地址表示的存储单元地址称为逻辑地址。
物理地址:CPU对存储器进行访问时实际所使用的20位地址称为物理地址。
若 逻辑地址为BA00H:A800H
则 物理地址=BA00H×10H+A800H=C4800H
10.简述堆栈指针寄存器SP的功能及堆栈的操作过程。
答:(1) SP的功能:指示进栈和出栈操作时的偏移地址。
(2) 堆栈的操作过程:进栈时,先将SP-2,再将数据压入堆栈(即先移后入);出栈时,先将数据弹出堆栈,再将SP+2(即先出后移)。