结构微处理器的工作方式.ppt
《结构微处理器的工作方式.ppt》由会员分享,可在线阅读,更多相关《结构微处理器的工作方式.ppt(235页珍藏版)》请在三一办公上搜索。
1、第 13 章 IA-32结构微处理器的结构与工作方式,本章讲述:13.1 80 x87 FPU的结构13.2 IA-32 结构微处理器的工作方式,从功能上来说,IA-32结构微处理器由以下三部分构成:(1)自80386开始的32位微处理器;(2)自80486引入的80 x87 FPU数值处理器;(3)片内的Cache。本章介绍80 x87 FPU结构特点,重点介绍IA-32结构微处理器的工作方式。,13.1 80 x87 FPU的结构13.1.1 概述,16位微处理器之前的CPU是不适合于数值计算的。因为它们的字长太短,能表达的数值范围太小;若用多字节表示,则计算的速度太慢;而且没有乘除法指令
2、,使用很不方便。16位甚至32位微处理器虽然有了较强的功能和较大的数值表示范围,但是做数值运算仍然十分困难。为此,在16位微处理器的基础上设计了与之相配合的专门用于数值计算的协处理器。自80486开始,在芯片内集成了协处理器(相当于80387),这些协处理器统称为80 x87 FPU。,数值计算主要有两个要求:(1)计算精度高;(2)计算速度快。为了满足这样的要求,80 x87 FPU中设置了8个80位的寄存器。这样的80位的寄存器可以用于以下7种数据类型:(1)整数字(16位);,(2)短整数(32位);(3)长整数(64位);(4)短实数(32位:1个符号位,8位阶,23位尾数),相当于单
3、精度数;(5)长实数(64位:1个符号位,11位阶,52位尾数),相当于双精度数;(6)组合的十进制数(80位:1个符号位,18位BCD数);(7)临时实数(80位:1个符号位,15位阶,64位尾数)。也称为扩展的双精度数。,在80 x87 FPU的内部是用80位的临时实数表示的,比一般高级语言中用的双精度数还长得多。其可表达的数值范围达到:3.19*10-4932X1.2*104932,是一个相当大的数值范围,可以达到很高的精度。在80 x87 FPU中设计了具有很强数值计算能力的指令系统,其主要的指令种类如表13-1所示。,80 x87 FPU的指令是与IA-32结构微处理器的指令混合编制
4、在一个完整的程序中的,即程序中有一些指令由80 x87 FPU执行,而另一些指令由IA-32结构微处理器执行。指令这样分配是自动实现的。而且在80 x87 FPU执行数值运算指令时,IA-32结构微处理器可以继续执行自己的指令,做到两个处理器的并发执行,从而大大提高了系统的能力。IA-32结构微处理器的所有寻址方式都可以用于寻址80 x87 FPU所需的存储器操作数,因而80 x87 FPU可以方便地处理数值数组、结构、各种变量。,80 x87 FPU与IA-32结构微处理器的密切配合可以使数值运算(特别是浮点运算)的速度提高约100倍。8086与8087结合的一些典型运算指令的执行时间如表1
5、3-2所示。特别要指出的是,80 x87 FPU的浮点运算符合IEEE的浮点标准。由于80 x87 FPU能不带舍入地处理18位十进制数,所处理的整数长度可达64位(1018),因而广泛地应用于在事务处理、商业部门和计算机辅助设计(CAD)等领域。,13.1.2 80 x87 FPU的数字系统,当人们用纸进行数值计算时,从理论上讲可以是完全精确而不带任何误差的。也即人们所使用的实数系统是连续的,任意大小与精度的数值都可以表示。对任何一个实数值来说,总存在着无穷多个更大的数值和无穷多个更小的数值;同时,在任何两个实数之间,也存在着无穷多个实数。例如在1.5与1.6之间,就存在着1.51、1.52
6、、1.555、1.599999、1.59999999等无穷多个实数。,显然,计算机是不可能工作在整个实数轴上的。无论计算机的规模有多大,它的寄存器和存储器的长度总是有限的,这就使得计算机所能表示的数值大小(范围)及数值精度受到限制。所以,实际上计算机所能表示的实数系统是一组离散的、有限的数值,它仅仅是实数集的一个子集,是实数系统的一种近似。计算机的位数越多,可表达的数值范围越大,能表示的数值的精确度也越高。,80 x87 FPU中的实数是一种双精度的长实数,它的表示范围大约为4.1910-3071.6710306。这是一个相当大的数值范围,在实际应用中,需处理的数据和最终结果超出这一范围的情况
7、是相当罕见的。可见,虽然80 x87 FPU是微型计算机中的协处理器,但已为实际应用提供了一个“足够大”的取值范围。而80 x87 FPU中的临时实数的取值范围更大,如表13-3所示。,把80 x87 FPU的基本实数系统投影到实数轴上,其中的实点()表示80 x87 FPU所能精确表示的实数,如图13-1所示。80 x87 FPU所能精确表示的两个相邻的实数之间总有一个间隔。如果某次运算的结果正好是80 x87 FPU所能表示的某个实数值,那么80 x87 FPU就精确地表示它;但是经常出现结果值落在两个相邻的实数之间,此时,就要根据舍入规则,将该结果舍入成为它所能表示的值。这就有一个精度问
8、题。但是在80 x87 FPU中,大部分应用场合精确度是足够的。,从图13-1可以看到,80 x87 FPU所能表示的实数不是均匀地分布在实数轴上,在任意的2的连续的幂次方之间,80 x87 FPU所能表示的实数个数是相等的(因为它的位数是固定的),即在216(65536)和217(131072)之间存在着的可以表示的实数个数与21(2)和22(4)之间是相同的。因此,可以表示的两个相邻实数之间的间隔是随着数值的增大而增大的。,一般来说,双精度数的实数集已经足够大(表达范围)、足够密(精确度)了。在80 x87 FPU中所以还要有80位的临时实数是想给常数和中间结果以更大的范围和更高的精度,以
9、保证最后结果的精确度。所以,在运算过程中,应尽可能把中间结果保存在80 x87 FPU的寄存器堆栈中,而不要以结果的形式存放在存储器中。80 x87 FPU的7种数据类型的格式,如图13-2所示。80 x87 FPU各种数据类型所能表达的数值范围如表13-4所示。,1.二进制整数80 x87 FPU中有三种二进制整数类型,但它们的格式实际上是相同的,只是位数不同。最高位(最左面的位)是符号位,“0”表示正,“1”表示负。负数用补码表示。值得注意的是,在80 x87 FPU中只有二进制整数是用补码表示的,其他数据类型均采用原码表示正负数只是符号不同,数值位是相同的。,2.十进制整数在80 x87
10、 FPU中的十进制整数是用组合的BCD码表示,共用10个字节即80位。最高字节的最高位为符号位,其余位无用,后面9个字节,每个字节为两位BCD数(故称为是组合的),因此总共是18位十进制数。,3.二进制实数80 x87 FPU的二进制实数都采用科学记数法表示,分为阶和尾数,在计算机中则用浮点数表示,符合IEEE标准。每个数由三部分组成:符号字段、阶码字段和有效数字段。符号字段规定数的正负;有效数字段用于存放数值的有效数字(尾数);阶码字段用于调整二进制小数点的位置,它也决定了数值的大小。,80 x87 FPU中通常是以规格化的格式来表示其有效数字的,即以1fffff的格式表示有效数字的。其中“
11、”表示一个假设的小数点,故有效数字由一位整数及一个由多位数字组成的小数部分组成。其中小数部分的位数取决于实数的类型,短实数为23位,长实数为52位,而临时实数为63位。在实数的这种规格化表示中,整数位取值总是“1”,这样就消除了“小”的数值的前面的那些“0”,从而使得有效位字段中所表示的有效数位的数目达到最大值。,但是80 x87 FPU的短实数和长实数中的整数位是一个隐含位,即它实际上并没有真正出现在实数格式当中,而只有在临时实数格式当中,才真正有这个整数位。为了确定数值大小,还必须考虑指数部分(阶码)。尾数的规格化处理提高了数值的精度,而引入阶码就扩大了数值的表达范围。阶码是为了把二进制小
12、数点定位到有效数字中,它与科学计算中所采用的十进制指数类似。指数(阶码)为正,表示小数点应向右移;指数为负,小数点应向左移。,为了省去指数中的符号和便于实现实数之间的比较,80 x87 FPU中以偏移的形式来存放指数,即在原指数上加上了一个常数偏移基数。这个偏移值对于不同的数据类型是不相同的。对于短实数,偏移值为127=7FH;对于长实数偏移值为1023=3FFH;对于临时实数,偏移值则为16383=3FFFH。选择这样的偏移值是为了使阶码总是为正。这样做的好处是,两个实数可以像两个不带符号的二进制整数一样进行比较,一旦发现某个对应位不同时,就可以确定数的大小,对后面的各位就没有必要再进行比较
13、了。采用了偏移指数以后,实现的真实指数可以由阶码段的值减去相应的偏移基数来求得。,若有一个用十六进制数表示的短实数为:BE580000展开成二进制为:1011 1110 0101 1000 0000 0000 0000 0000把它的符号位、阶码字段和有效位字段分开为:1 011 1110 0101 1000 0000 0000 0000 0000符号位为1,则此数为负数。阶码部分转换的十进制值124,减去偏移基数127,则实际的指数为:124-127=-3有效数为:1.1011 000 0000 0000 0000 0000,把这个二进制数字转换为十进制格式得到:1.0+.5+.125+.0
14、625=1.6875把这三部分综合起来,可得短实数为:x=-1.68752-3=-1.6875(0.125)=-0.2109375,13.1.3 80 x87 FPU的结构,8087、80287、80387的结构分别如图13-3、图13-4、图13-5所示。它们的主体部分是一样的。8087的结构分成两大部分:控制单元(CU)和数值处理单元(NEU)。数值处理单元负责执行所有的数值运算处理指令;而控制单元则负责取指令、对指令译码、读写操作数、执行8087的非数值运算指令等。这两个单元能彼此相对独立地进行操作,可以使有些操作并发进行,并使NEU在进行数值运算处理时,由CU保持与主CPU(8086)
15、同步。,1.控制单元控制单元CU的重要功能之一是保持8087与CPU(8086/8088)同步。8087的设计,可以把8087看成是8086/8088在结构上、功能上的扩充,8087的指令与CPU的指令是处在同一指令流中的。之所以能实现这一点,是由于在CPU的指令系统中安排了一条换码(交权)指令ESC。这是一条16位的指令,但只要它的前五位为11011,则CPU就把它看为一条ESC指令。所有的8087指令,对于CPU来说就是一条ESC类的指令;当主CPU取出这样一条指令时,就按ESC指令处理。,此时,CPU内部不进行任何操作相当于一条NOP指令;但ESC指令可以寻址存储器操作数,主CPU对这个
16、操作数进行一次“假读”,即执行一次存储器读周期,按规定的寻址方式,把地址送至地址总线上,发出读存储器的有关控制信号,把存储器中指定单元的信息读出至数据总线上,但封锁了CPU的数据总线(即CPU不读取这个数据),然后CPU执行下一条指令。对于8087来说就要执行指定的指令。所以,8087就要和CPU一样取指令及对指令译码。当译码为CPU指令时(非ESC指令),8087不做任何操作;只有当译码到ESC类指令时,8087才进行指定的操作。,8087的CU监视CPU发出的状态信息(S0#、S1#、S2#与S6),当它们为(1、0、1、0)时,就是CPU的取指周期,则CU同样从数据总线上读取指令,以使8
17、087与主CPU同步地获取指令。8086为了做到取指令与执行指令并发进行(流水线结构),在CPU内部有一个预取指令队列。所以,8087中也要有一个预取指令队列。CU又可以通过监视CPU的队列状态线(QS0、QS1)做到与CPU同步地从指令队列中取得指令,并及时对其进行译码。,8087的指令,有的没有存储器操作数,这时主CPU执行的ESC指令与执行NOP类似;有的需要存储器操作数,则主CPU执行一个上述的“假读”周期,最多可读取一个字(主CU不获取这个字),用于执行ESC指令。对于8087来说,读出的存储器操作数可能用于加载指令(读),也可能用于存储指令(写),而且操作数往往不只是一个字,这就可
18、能出现以下情况:(1)8087只读取一个“字存储器操作数”,则在上述的主CPU的“假读”周期中,8087把从存储器中读出的一个字,从数据总线上加载至8087中。,(2)8087要读取多个“字存储器操作数”。则在主CPU执行这条ESC指令时,执行一次“假读”周期。8087一方面在上述的“假读”周期中从数据总线上获取一个字操作数;另一方面把出现在地址总线上的地址锁存下来。接着8087向主CPU发出DMA请求,接管总线,以锁存的地址为基准,从存储器中读取余下所需的字操作数。然后,把总线释放给CPU。,(3)若8087要用存储器保存数据,也就是要写存储器,则在主CPU执行这条ESC指令时,进入“假读”
19、周期;但8087并不获取“假读”的操作数,而只是获取锁存在地址总线上的地址。当8087完成了内部操作,真正要执行写存储器操作时,它向CPU发出DMA请求,接管总线。以锁存的地址为基准,写入指定数量的操作数。然后,把总线释放给主CPU。,2.数值处理单元凡是涉及8087寄存器堆栈的所有指令都是由数值处理单元NEU执行的。这些指令包括算术运算、逻辑比较、超越函数的计算、数据传送以及常数指令。在NEU中,主要部分是8个80位的寄存器栈。为了适应各种数据类型的需要,为了保证运算的精确度,也为了使数的传送和处理更为方便,NEU中的数据通路的宽度是80位的,其中小数部分64位,指数部分15位,另加一个符号
20、位。NEU中的80位数据是放在寄存器栈中的,并通过栈来进行处理。,8个80位的寄存器构成了一个先进后出的栈,由状态寄存器中的三位形成栈指针(ST),规定了当前的栈顶。栈的操作是以栈顶为基准的。压入(PUSH)操作把ST减1,再将某个数值装入新的栈顶寄存器;弹出(POP)操作把当前栈顶寄存器的数值输出,然后将ST加1。所以,8087中的堆栈与8086/8088中的堆栈相似,是下推式的堆栈。堆栈操作和栈中的数值及堆栈指针的变化情况,如图13-6所示。,在8087初始化时,ST=0,则在入堆操作时ST-1=000-001=111=7,这在工作时是要注意的。8087对寄存器栈操作时,可以明显规定某个寄
21、存器ST(i),这称为显式寻址;也可以不明显规定是哪个寄存器,则隐含着对当前的栈顶(即状态寄存器中的ST所指向的某个寄存器)进行操作。例如,求平方根指令通常为:FSQRT即对栈顶寄存器中的操作数求平方根,这种寻址称为隐式寻址。,要注意的是,隐式寻址是指出当前栈顶寄存器,也即是由状态寄存器中的堆栈指针所指定的寄存器,而不一定是寄存器0(R0)。若状态寄存器中的堆栈指针为000,则当前栈顶即为R0;若堆栈指针是010,则当前栈顶是R2。另外,显式指定的ST(i),其中0i7,也是相对于当前栈顶的,ST(i)是从当前栈顶计算起的第i个寄存器。例如有指令:FADD ST,ST(2)若状态寄存器中的ST
22、=001,则是指R1与R3(001+2=3)的内容相加。,为了优化数值协处理器的功能,每一个寄存器都有一个标志位(每寄存器两位)与之相对应,用以反映寄存器的情况,如图13-7所示。这个标志字,对于程序员来说是无用的。80287的功能结构几乎与8087完全一样,只是把8087的控制单元CU改称为总线接口单元BIU,两者在功能上是完全一样的,特别是数值处理单元部分都是以8个80位的堆栈作为核心,支持多种数据格式。,80387的结构更为复杂一些。从大的方面来说,有总线控制逻辑、数据接口和控制单元及浮点单元三个部分。但从本质上来说,仍可分为80387内部的浮点运算部分以及与80386和存储器连接的接口
23、和控制部分。后一部分负责监视80386的指令流,当译码分析到数值运算指令时,由80387执行。执行所需的数据以及计算结果的存储也是由这部分负责,其工作过程与8087部分介绍的一致。,只是80387与80386相应的有关寄存器和指针是32位的,而且有可能与工作在保护虚地址方式的80386协同工作,主要反映在事故指针上。但80387的主体部分仍是以 8个80位的堆栈为核心,配合必要的运算逻辑的浮点运算部分。这部分除了在运算逻辑部分作了较大的改进外,其他部分与8087是一致的,特别是堆栈格式和操作方法是完全一样的。8087、80287和80387的状态字分别如图13-8、图13-9、图13-10所示
24、。这三者的状态字基本上是一样的。,最高位都是B(BUSY)位,反映80 x87 FPU是否忙的状态位。80 x87 FPU都有一条BUSY引线,一旦它们的数值运算部分开始执行指令,则状态寄存器中的B位就置1,输出引线BUSY就变为高电平。在IA-32结构微处理器中,设置了引线TEST(TEST与80 x87 FPU的BUSY线相连)和指令WAIT,就可以做到IA-32结构微处理器与80 x87协处理器同步。第1311位ST即为堆栈指针,它的值规定了哪一个寄存器是当前的栈顶。ST=000表示栈顶是第0号寄存器R0,ST=001表示栈顶是R1,S=111表示栈顶是R7。,4个条件位C3、C2、C1
25、、C0,用于80 x87 FPU的比较指令后,反映比较的结果,是一些转移指令的依据。当执行了比较指令(栈顶的内容与指定的操作数相比较)之后,状态位C3、C2、C0反映了比较以后的结果,如表13-5所示。若操作数为0,则上述条件码也可以用来反映栈顶(TOP)的内容是否等于0或大于0、小于0。当执行了检验指令FXAM后,条件码反映出栈顶内容的一些特殊情况。8087的条件码和数据检验情况如表13-6所示。,状态字的第7位在8087中为IR位即中断请求标志位,在80287和80387中都称为ES位即总的出错状态位。即在80 x87 FPU中,有任一种未屏蔽的异常发生,则IR位或ES位置1,用来表示80
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 微处理器 工作 方式
链接地址:https://www.31ppt.com/p-6332394.html