收藏 分享(赏)

计算机系统结构第2章指令系统.ppt

上传人:hskm5268 文档编号:8612577 上传时间:2019-07-06 格式:PPT 页数:130 大小:3.85MB
下载 相关 举报
计算机系统结构第2章指令系统.ppt_第1页
第1页 / 共130页
计算机系统结构第2章指令系统.ppt_第2页
第2页 / 共130页
计算机系统结构第2章指令系统.ppt_第3页
第3页 / 共130页
计算机系统结构第2章指令系统.ppt_第4页
第4页 / 共130页
计算机系统结构第2章指令系统.ppt_第5页
第5页 / 共130页
点击查看更多>>
资源描述

1、1,2,第二章 指令系统,指令系统是硬件和软件之间的接口,它会表明一台计算机具有哪些硬件功能,是硬件逻辑设计的基础; 指令系统也需要为编译器提供明确的编译目标,使编译结果具有规律性和完整性。指令系统是计算机系统软硬件功能分配的界面,也是计算机系统结构设计的核心,其功能对计算机系统的性能有直接的影响。,3,本章内容,2.1 数据表示 2.2 寻址技术 2.3 指令格式的设计与优化 2.4 CISC与RISC,4,2.1 数据表示,计算机系统中所处理的数据类型各种各样如:文件、图、表、树、队列、链表、栈、向量、串、实数、整数、布尔数和字符等。计算机系统结构要解决的问题是如何在硬件和软件之间合理分配

2、这些数据类型,即:系统所有的这些数据类型,哪些由硬件实现,哪些用软件来实现。,5,数据表示指的是能由硬件直接识别的数据类型,也就是由指令系统处理的数据类型。例如,Pentium II的数据表示包括:8位、16位和32位带符号和无符号整数,二-十进制数,32位和64位浮点数,串数据。例如,UltraSPARC II的数据表示有:8位、16位、32位和64位带符号和无符号整数,32位、64位和128位浮点数。UltraSPARC II没有提供硬件指令支持二-十进制数和串数据表示,但是它的浮点运算精度可以更高。,6,数据表示是数据类型中最常用的、相对比较简单的、易于硬件实现的那些数据类型。相对较复杂

3、的数据类型,如表、树、队列、链表等则是由软件来处理,它们是数据结构研究的对象。由于基本的数据表示在前导课程已有详细阐述,本节主要更深入地讨论浮点数表示涉及到的一些问题,以及自定义数据表示。,7,2.1.1浮点数表示,现代大部分计算机都引入了浮点数据表示,典型的长度有32位和64位。浮点数表示的关键问题是,在数据字长确定的情况下,能设计出一种具有最佳表示范围、表示精度和表示效率的浮点数表示方式。 一. 浮点数的表示范围计算机中,典型的浮点数机器字格式如图2-1所示。,8,上图中,浮点数机器字代码由两部分组成:阶码部分e和尾数部分m。阶码部分包含了阶符和阶码值两部分。尾数部分包括数符和尾数值。浮点

4、数的值可表示为:,其中,9,浮点数表示需要确定以下6个参数: 尾数的基rm尾数表示可以采用用二进制、四进制、八进制、十六进制和十进制等,即尾数的基rm可分别取值为2、4、8、16、10等。 尾数的值m尾数m可以采用原码或补码表示,数值可以采用小数或整数表示。,10, 尾数长度n尾数占用的二进制位数称为尾数长度,不包括符号位。 尾数的基为rm,尾数长度为n可表示的rm进制数的位数为 当尾数采用二进制即rm=2时,尾数长度就是n ;当尾数采用十六进制,则需要4位二进制数表示1位十六进制数,这时十六进制尾数的实际位数为: =n/4 阶码的基re :阶码一般采用二进制表示,即阶码的基re=2。 阶码的

5、值e :一般采用移码或补码表示,值采用整数表示。 阶码长度q由于阶码采用二进制,因此,阶码长度q的值就是阶码部分的二进制数位数。注意q不包括阶码符号位。,11,由于机器字长的限制,任何一种浮点数的表示范围和可表示的浮点数个数是有限的,浮点数只能表示出数轴上分散于正、负两个区间上的部分离散值,如图2-2所示。,12,在尾数采用原码、纯小数,阶码采用移码、整数的浮点数表示方式中,规格化浮点数的表示范围N正和N负为:,13,例2-1 浮点数长度32位,数符1位和阶符1位,阶码长度q=6,尾数长度n=24,尾数和阶码采用二进制,即rm= re=2。尾数采用原码、纯小数,阶码采用移码、整数,其规格化浮点

6、数表示范围为:,即,14,例2-2 浮点数长度32位,数符1位和阶符1位,阶码长度q=6,尾数长度n=24,尾数采用十六进制和阶码采用二进制,即rm=16,re=2。尾数采用原码、纯小数,阶码采用移码、整数,给出其规格化浮点数表示范围。,解:由于尾数采用十六进制,24位二进制表示6位十六进制数,故浮点数表示范围为:,即,15,上述两个例子表明,当浮点数阶码尾数的二进制位数、码制、小数点位置都相同时,则浮点数表示范围由基值rm决定,基值rm越大表示范围越大;但是,基值rm越大,浮点数在数轴上的分布越稀。二规格化浮点数的表数个数由于字长限制,浮点数表示方式所能表示的浮点数个数是有限的、不连续的。可

7、表示的规格化浮点数的个数为:可表示的阶码的个数与可表示的尾数的个数的乘积。如果阶码的基re=2,则q位长的阶码可表示的阶码的个数为2q个。,16,尾数的基为rm,n位长的尾数可表示的rm进制数的位数为 ,每个rm进制数的数位均可以有 共有rm个取值,所以,尾数的总个数为 ,但应去掉小数点后第1个 进制数位是0的那些非规格数。显然,非规格化尾数的个数占了全部尾数总个数的 的比例。因此,可表示的浮点数规格化尾数的总个数就为 。,由此推出可表示的规格化浮点数的个数为:,可以推出,r m越大,在与r m =2的浮点数相重叠的范围内,所表示数的个数要少得多,即数的密度分布会更稀。,17,三规格化浮点数的

8、表示精度浮点数表示方式所能表示的浮点数个数是不连续的、有限的,只能表示出实数中很少的一部分,是实数的一个子集,称为浮点数集。浮点数集的表示误差指的是浮点数集中两个最接近的浮点数之间的误差。在浮点运算中,会出现运算中间结果或最后结果的尾数不在浮点集中的情况(不是溢出),这时必须用最接近这个结果的浮点数表示。例如,浮点加法运算过程中,对阶操作需要对一个浮点数进行右规时,就要对尾数的最低位进行舍入,通常采用四舍五入来确定最低位的值,这时就产生了误差。,18,表示误差也称为表示精度。规格化浮点数的表示精度直接与尾数基rm的取值和rm进制的尾数位数 有关。规格化浮点数运算中,如果需要对尾数的最低位进行处

9、理,通常采用四舍五入的规则,因此,可以认为表数误差是尾数的最后一位的值的一半。由此可以得出规格化浮点数的表数精度为:,(2-3),19,根据式(2-3),可以得出例2-1和例2-2中两种不同尾数基值浮点数的表示精度分别为:比较以上的两个浮点数的表示精度,可以看出尾数基值rm=16时,其表示精度与rm=2相比将损失23倍。显然,如果浮点数尾数的二进制位数长度相同时,尾数基值rm为2具有最高的表示精度。,20,四浮点数机器字的格式设计定义一种浮点数机器字的格式需要确定浮点数表示的6个参数,具体原则如下: 确定尾数m的数制和码制。目前多数机器尾数m采用小数、原码表示。 确定阶码e的数制和码制。目前一

10、般机器阶码e都采用整数、移码表示。确定尾数的基rm。目前多数机器尾数基值rm 取2。 确定阶码的基re。在一般通用计算机中,都取re=2。,21, 在浮点数表示方式中,尾数长度n主要影响表示精度,阶码长度q主要影响示数范围。可根据要求的示数范围和表数精度确定n和q的值。按照目前多数实际机器的情况,假设:浮点数尾数m用原码、小数表示,阶码e用移码、整数表示,尾数基值rm=2,阶码基值re=2。要求浮点数表示范围不小于N(N为可表示的最大正数),表示精度不低于 ,确定q和n的值的方法如下。,22,根据浮点数表示范围的要求,可得下式:解这个不等式:得到阶码长度q为:(2-4),23,根据浮点数表示精

11、度要求,可得下式:故得出尾数长度n为: (2-5)由(2-4)和(2-5)两个不等式得出的阶码长度q和尾数长度n,再加上一个尾数符号位mf和一个阶码符号位ef ,就组成了一种满足以上假设浮点数表示范围和表数精度的浮点数机器字格式。一般为了使浮点数机器字字长满足整数边界的要求,还需要适当调整q和n的值。,24,例2-3 设浮点数尾数m用原码、小数表示,阶码e用移码、整数表示,尾数基值rm=2,阶码基值re=2。要求规格化浮点数的表示范围N为 ,要求浮点数表数精度不低于 ,试设计一种浮点数的格式。,根据浮点数表示范围的要求,用式(2-4)计算阶码的长度q:,25,考虑到要满足整数边界,可取阶码长度

12、 q=7 位。 根据浮点数表数精度要求,用式(2-5)计算尾数长度n: 考虑到要满足整数边界,可取尾数长度n=54位。,26,此例中,阶码长度q=7位,尾数长度n=54位,再加上1位尾数符号位和1位阶码符号位,则浮点数机器字字长为2+q+n=63位,距离机器字字长的整数边界要求还差1位。如果将这1位加到尾数长度上,则设计的64位浮点数机器字格式如下图所示。,27,在数据表示上,高级语言与机器语言一直存在语义差距。高级语言中,在引用数据之前必须用类型说明语句定义数据类型,其运算符不反映数据类型,是通用的。如在C语言程序中,有以下语句:int i,jfloat x,yi=i+jx=x+yi、j是整

13、型数据,x、y是实型数据, 运算符“+”可用于整型也可用于实型数据相加。,2.1.2 自定义数据表示,28,然而,一般的机器语言程序则完全不同,指令中是由操作码定义操作数据的类型。如浮点数加法机器指令:以上指令中,操作码是浮点加,指定对操作数X和Y进行浮点加法运算,无论X和Y是否是浮点数,都是按浮点数对待。 因此,编译时需要把高级语言程序中的数据类型说明语句和运算符转换成机器语言中不同类型指令的操作码,并要验证指令中操作数的类型是否与运算符所要求的一致,若不一致,还需用进行处理,从而增加了编译程序的复杂性。,29,为了在数据表示上缩小高级语言与机器语言的语义差距,有人提出在机器语言级实现自定义

14、数据表示,即由数据本身定义自己的类型,同时也简化了指令系统和编译器。自定义数据表示主要有带标志符的数据表示和数据描述符数据表示。 一. 带标志符的数据表示带标志符的数据表示是指在数据中采用若干位来表示数据的类型。,30,例如,早期的B7500大型机中,每个数据用三位标志符来区分8种数据类型,如下图所示:标志符虽然主要用于指明数据类型,也可用于指明所用信息类型。例如,R-2计算机中,采用带标志符的数据表示的数据字格式如下图所示:,31,上图中, 共有10位标志: * 2位功能位用于区别数据是操作数、指令、地址还是控制字。* 2位陷阱位用于软件定义4种捕捉方式,为程序员对程序进行跟踪控制提供方便。

15、* 1位读写位用于指定数据是只读的还是可读可写的。* 4位类型位可在功能位定义的基础上进一步定义数据的类型。* 1位标志位是奇偶校验位。,32,标志符数据表示缩小了高级语言和机器语言语义差距,但是数据字因增设标志符,会增加程序所占的主存空间,而且按标志符确定数据属性及判断操作数之间是否相容等操作,会增加硬件复杂性,降低单条指令的执行速度。 二数据描述符数据表示对于一组具有相同类型而且是连续存放的数据,如向量、矩阵和多维数组,没有必要让每个数据都带有相同的标志符,因此,可以采用数据描述符。,33,数据描述符与标志符的主要区别是:标志符只作用于一个数据,而描述符要作用于一组数据。因此,标志符通常与

16、数值一起存放在同一个数据单元中,而描述符一般单独占用一个存储单元。描述符在描述一组数据的属性中,还包括整个数据块的访问地址、长度及其他特征或信息。,34,(a) 数据描述符,图2-6 B6700机中数据描述符表示,(b) 数据,B6700计算机的描述符如下图所示,前三位为“000”,表示该字为数据;前三位为“101”,表示该字为数据描述符。如果该字是数据描述符,则进一步用8位标志位描述数据特性。如果描述的是整块数据时,“地址”字段用于指明首元素的地址,“长度”字段用于指明块内的元素个数。,35,可以将描述符按树型连接以描述多维数组表示。例如,有一个34二维阵列A:下图表示了用数据描述符描述A阵

17、列的情况,具体使用了两级描述符,一级描述符一个,二级描述符是连续存放的三个描述符,描述符的前三位都为101。,36,37,一级描述符的“长度”位为3,指向有3个元素的二级描述符的首址;每个二级描述符的“长度”位都为4,分别指向对应的有4个元素的数据。 图中,二维阵列A是一条指令的一个操作数,指令中的一个地址X指向描述A阵列的一级描述符,OP表示操作码。,38,从指令系统层来看,程序所处理的数据通常存放在主存储器、寄存器、堆栈、I/O接口中,寻址技术就是指如何从这些存储部件中获得数据的技术。寻址技术主要讨论存储部件的编址方式、寻址方式和定位方式。在“计算机组成原理”课程中对指令的各种寻址方式有详

18、细的介绍,在本节我们更注重于分析和比较它们的特点。,2.2 寻址技术,39,要访问存放在主存储器、寄存器、堆栈、I/O接口中的数据,必须对这些存储部件的空间进行编址。编址方式主要涉及编址单位和编址空间。 一. 编址单位存储空间常用的编址单位有:字编址、字节编址和位编址。多数机器按字节编址,但是通常主存储器的字长是4个字节以上,而且多数机器允许按字节、单字、双字访问存储器,因此编址单位与访问存储器的信息宽度不一致,从而产生数据如何在存储器中存放的问题。,2.2.1 编址方式,40,例如,某台机器,按字节编址,数据有字节(8位)、半字(双字节)、单字(4字节)和双字(8字节)不同宽度。主存数据宽度

19、64位,即一个存储周期可访问8个字节。采用按字节编址,大于字节宽度的数据是用该数据的首字节地址来寻址的。一种存放数据的方法是,在主存中允许数据从任意字节地址单元存放,如图2-8(a)所示,这种方法很容易出现一个数据跨主存宽度边界存储的情况;对于跨界存放的数据,即使数据宽度小于或等于主存宽度,也需要两个存储周期才能访问到,导致访问速度显著下降。,41,(a)数据按任意字节地址存放,图2-8 数据在主存中的存放方式,42,另一种数据存放方法是,要求数据在主存中存放的地址必须是该数据宽度(字节数)的整数倍,即双字地址的最低3个二进制位必须为000,单字地址最低2位必须为00,半字地址最低1位必须为0

20、,如图2-8(b)所示。这种存放方法也称为按整数边界存储方式,它可以使访问任意宽度的数据都只用一个存储周期。虽然浪费了一些存储空间,但是速度比上一种方法有显著提高。,43,(b)数据按整数边界存放,图2-8 数据在主存中的存放方式,44,二. 编址空间的组织计算机中需要编址的存储部件主要有:通用寄存器、主存储器和I/O接口。它们的编址空间可以有以下3种组织方式。 (1)三个地址空间由于通用寄存器、主存储器和I/O接口的工作速度和容量等性能差别较大,很多机器中对这3个地址空间进行独立编址。也就是说,每个地址空间都从0开始编地址码。CPU中的通用寄存器数量有限,访问速度很快,其容量比主存储器小得多

21、,所需要的地址码长度短。一般只有单一的直接寻址方式。,45,主存储器的容量大,所需要的地址码长度很长。采用的寻址方式最复杂,一般有间接寻址和变址寻址等多种寻址方式,以避免在指令中直接表示主存单元的地址码。I/O接口中的寄存器的数量一般比通用寄存器多,其地址码长度介于寄存器和主存之间,因此多采用直接寻址方式,也有机器采用寄存器间址方式。三个地址空间独立编址,由于每个地址空间都从0开始编码,因此三个空间会有重叠,但是指令的操作码和寻址方式会明确指出所访问的是哪个地址空间。访问I/O地址空间则需要设置专用的I/O指令。如Intel 80x86系列就采用三个地址空间独立编址。,46,(2)二个地址空间

22、CPU的通用寄存器独立编址;I/O接口寄存器和主存储器统一编址,统一编址空间的高端地址一般用于I/O接口寄存器地址。二个地址空间方式中,访问主存的指令就能访问I/O寄存器,可以减少指令条数,但其问题是主存的地址空间会减小。如VAX-11系列机就采用二个地址空间的组织方式。 (3)一个地址空间所有数据存储单位统一编址,地址空间的低端地址是CPU的通用寄存器地址,高端地址是I/O接口寄存器地址。在单片机中,片内存储器容量不大,一般采用一个地址空间,以减少指令种数。,47,计算机中的一些专用寄存器或寄存器堆,如预取指令和数据的缓冲器,是不需要编址的。Cache存储器映射的是相联的主存内容,因此不需要

23、编址。在堆栈型计算机中,数据的存取完全按照先进后出的方式进行,其存储部件是不需要编址的。,48,一条指令包括操作码和地址码,指令的功能就是根据操作码对地址码提供的操作数完成指定的操作。指令中以什么方式提供操作数或操作数地址,称为寻址方式。CPU根据指令约定的寻址方式对地址字段的有关信息作出解释,以找到操作数。每种机器的指令系统都有一套自己的寻址方式。不同计算机的寻址方式的分类和名称并不统一,但大多数可以归结为以下几种类型。,2.2.2 寻址方式,49,(1)立即寻址 (2)寄存器寻址 (3)主存寻址. 直接寻址方式. 间接寻址方式. 变址类寻址方式 (4)堆栈寻址,一台机器的指令系统可以采用多

24、种寻址方式,那么在指令中如何区分它们呢?常见的方法有两种:一种方法是由操作码决定其寻址方式,即由操作码含义隐含约定采用何种寻址方式;另一种方法是在指令中设置寻址方式字段,由字段不同的编码组合来指定操作数的寻址方式。,50,2.2.3 程序在主存中的定位方法,在多数计算机中,编译器在对一个源程序或源程序段进行编译时,是不能确定程序在主存中的实际位置。因此,编译后的目标程序通常是从零地址开始分配地址空间,这种地址称为逻辑地址。逻辑地址的集合称为逻辑地址空间。计算机中的主存储器,是一维线性编址的,这种地址称为主存物理地址,其地址的集合称为主存物理空间。对于多道程序,各目标程序的逻辑地址空间与物理地址

25、空间是不一致的。当程序装入主存时,就需要进行逻辑地址空间到物理地址空间的转换,即对程序进行重定位。,51,静态重定位方法:要求对程序中那些需要修改地址的指令和数据加上某种标识,在程序运行之前,由专门的装入程序一次将目标程序的带标识指令和数据的逻辑地址变换成物理地址,程序一旦装入主存其物理地址不再改变。如图2-9所示,当目标程序A装入主存从a地址开始的物理空间中时,为了正确运行程序,指令的地址码应必须根据不同的寻址方式作相应的变换。如用直接寻址、间接寻址和变址寻址访存时都应将指令中的逻辑地址加一个a值,而对立即数和相对地址,则不加a值。,52,图2-9 静态定位方式,53,静态定位方式在程序运行

26、时位置不能再改变,主存利用率低。如果程序需要的容量超过分配给它的物理空间,就必须采用覆盖结构。此外,多个用户不能共享存放在主存中的同一个程序。而程序的动态定位方式则可以避免这些问题。程序动态定位方式:程序在装入主存时不修改指令的地址码,而是在程序执行时,通过硬件支持的基址寻址方式将操作数的逻辑地址转换为主存的物理地址。,54,如图2-10所示,将目标程序A在主存中的起始地址a存入对应的基址寄存器中,程序执行时,由地址加法器将指令操作数的逻辑地址加上基址寄存器中程序的起始地址,就形成了操作数的物理地址。实际上,并不是所有指令的地址码都需要修改,如立即寻址和相对寻址是不需要修改的,为此需要在指令中

27、标识本指令的主存地址码是否需要加上基址。,55,图2-10 动态定位方式,56,动态定位方式允许为一个程序分配不连续的主存空间,并且也允许多个程序共享存放在主存中的同一个程序段,有效地提高了主存的利用率。它还可以支持虚拟存储器,从而大大扩展了逻辑地址空间。但实现动态定位方式需要有硬件支持且实现存储管理的软件算法较复杂。,57,2.3 指令格式的设计和优化,设计者在选择指令格式时,必须考虑许多因素。包括扩展新指令和利用在指令系统的使用周期中出现的新技术都是相当重要的。具体的设计原则主要有三条。 一般情况下,短指令要优于长指令。占内存少,减少内存带宽,可以加快取指令;使指令长度达到最小,可能会使译

28、码和重叠执行变得困难,增加指令执行时间。 在指令格式中必须有足够的空间来表示所有的操作类型,还要考虑留下富余的空间给以后的扩展指令使用。,58,关于地址码的个数与每个地址码中位的数量。例如:典型RISC机器MIPS的指令长度固定为32位,操作码6位,访存指令设计有3个地址码,2个5位的寄存器地址与1个16位的主存地址偏移量,采用基址寻址方式访问主存。,本节先描述与分析指令操作码的三种编码方式和地址码的优化,然后讨论典型的CISC处理器Pentium II与RISC处理器SPARC的指令格式。,59,一条指令是由操作码和地址码两部分组成的。指令操作码的优化,就是指如何用最短的二进制位数来表示指令

29、的操作信息,使程序中指令的平均操作码长度最短。 操作码的编码方式主要有三种:定长操作码、哈夫曼(Huffman)编码和扩展编码。,2.3.1 指令操作码的优化,60,一. 定长操作码定长编码是指所有指令的操作码长度都是相等的。如果需要编码的操作码有n个,那么,定长操作码的位数最少需要 位。例如用指令字中第一个字节(8位)表示操作码。这种方式有利于简化硬件设计和减少指令译码时间,但是浪费了信息量。RISC(精简指令系统计算机)采用这种编码方法。,61,二. 哈夫曼编码 哈夫曼(Huffman)编码法的基本思想:当各种事件发生的概率不均等时,对发生概率最高的事件用最短的编码来表示,而对出现概率较低

30、的事件用较长的编码来表示,以使事件编码的平均位数缩短,从而减少处理时间。哈夫曼编码法可以用于信息压缩的场合,如存储空间的压缩和时间的压缩。使用哈夫曼编码对操作码进行优化表示,就需要知道每种指令在程序中出现的概率(使用频度),这是通过对大量已有的典型程序进行统计后得出的。,62,编码优化的程度用平均码长来评价,平均码长定义为:(2-6)其中, pi表示第i种操作码在程序中的出现概率或使用频度,共有n种操作码; li是第i种操作码的编码长度。,63,也可以用位冗余量来衡量编码优化的程度,位冗余量为其中 (2-7)(2-8)H称为信息熵(Entropy),表示用二进制编码表示n个码点时,理论上的最短

31、平均编码长度。因此,对实际编码的平均码长l,都有 ,故有0R1。,64,例2-4 假设某模型机共有n10种不同的指令,经统计各指令在程序中的使用频度如表2-1所示。若操作码用定长码表示需要 =4位。表2-1 某模型机指令使用频度举例,65,根据式(2-8)计算操作码的最短平均编码长度为:这表明模型机10种指令的操作码平均只需2.96位即可。如果用4位定长码表示,l=4,根据式(2-7)计算信息冗余量为:,66,利用哈夫曼算法,构造哈夫曼树。将10条指令的使用频度从小到大排序构成一个结点集,每次从结点集中选择频度最小的两个结点合并成频度为这两个频度之和的父结点,若结点集不为空集,就将生成的新结点

32、放到结点集中,继续从这个新的结点集中选择出2个频度最小的结点生成其父结点,直至结点集成为一个空集,就生成了一棵哈夫曼树。从根节点开始,对每个结点的两个分支分别用“0”和“1”标识。下面对此例使用哈夫曼编码,如图2-11所示。,67,图2-11 哈夫曼树举例,68,如果要得到指令Ii的操作码编码,则根据图2-11的哈夫曼树,从根结点到Ii叶结点的路径上,将沿线所经过的0或1代码依次组合起来就形成了Ii指令的哈夫曼编码,如表2-2左部分所示。,69,表2-2 操作码哈夫曼编码和扩展操作码编码,70,根据式(2-6)计算操作码哈夫曼编码的平均码长为:平均码长2.99位,非常接近于H。这种哈夫曼编码的

33、信息冗余量为:与4位定长码的26%信息冗余量相比要小得多。,71,需要指出的是哈夫曼编码并非是惟一的。只要将哈夫曼树各分支的“0”与“1”互换,就可以得到一组新的编码。如果存在多个相同的最小频度,由于频度合并的次序不同,会导致生成不同的哈夫曼树,得到的编码也不相同。但是,计算的哈夫曼编码平均码长l是惟一的,而且是可用二进制位编码平均码长最短的编码,因此哈夫曼编码是最优化的编码。,72,三. 操作码扩展编码 哈夫曼编码具有最优化的平均码长,信息冗余量也接近理想值。但是,哈夫曼编码形成的操作码一般不规整,码长种类多,不利于实现硬件译码和软件编译。 实际机器中采用将定长操作码与哈夫曼编码结合形成的一

34、种编码方式,称为操作码扩展编码。这种编码方式的操作码长度不是定长的,但只限于几种码长,较规整。具体编码规则是,根据要求确定编码的几种长度,然后从最短码开始,一种长度的编码通常要剩下一个或多个码点用作扩展标志,为后续较长的编码使用。与哈夫曼编码类似,扩展操作码中的短码不能是长码的前缀。,73,例2-4中的10条指令,采用2-4扩展操作码编码如表2-2右部分所示。将使用频度高的I1、I2用两位操作码的00、01表示,剩下二个码点10、11作为扩展为4位编码的标志。 根据式(2-6)计算这种扩展操作码编码的平均码长为:,74,表2-2 操作码哈夫曼编码和扩展操作码编码,75,这种表示法的平均长度和信

35、息冗余量,虽比哈夹曼编码的大,但比定长4位码小得多,而且编码较规整,是一种实际可用的优化编码。 为了便于硬件分级译码,一般采用等长扩展,如4-8-12扩展法表示操作码位数按4位、8位和12位,每级加长4位扩展。类似还有3-6-9扩展法等。实际机器中,也有根据需要采用每级扩展位数不等的不等长扩展法。,76,2.3.2 地址码的优化表示,指令由操作码和地址码组成。由于下一条指令地址由程序计数器给出,因此地址码只需要给出操作数和结果的地址。地址码长度主要取决于地址码个数、寻址方式、存储设备(通用寄存器、主存和堆栈等)的编址方式和寻址空间大小等。一. 地址码个数指令的地址码个数常见的有三个地址、二个地

36、址、一个地址及零地址。,77,(1)三地址指令格式为:这种格式可以使操作后两个操作数均不被破坏,可供再次使用,间接减少了程序的长度。如典型的RISC处理器都设置有三地址指令。(2)二地址指令格式为:由A2提供源操作数源地址;由A1提供目的操作数地址,在运算后不再保留,该地址改为存放运算结果,只是A1 或A2应尽量采用通用寄存器,以减少访存次数。这种格式减少了指令给出的显地址数,可以缩短指令长度。Intel 80x86主要采用这种指令格式。,78,(3)一地址指令格式为:一地址指令有两种常见的形态,由操作码定义它属于哪一种。 只有目的操作数的单操作数指令。指令中只给出一个目的地址A,A既是操作数

37、的地址,又是操作结果的存放地址。 隐含约定目的地址的双操作数指令。在某些机器中,双操作数指令也可采用一地址指令格式。源操作数按指令给出的源地址A读取,另一个操作数(目的操作数)隐含在CPU的累加器AC中,运算结果也将存放在AC中。如Intel 8x86的乘法、除法指令就采用该格式。可见,一地址指令不仅可用来处理单操作数运算,也可用来处理双操作数运算,这是使用隐地址以简化地址结构的典型例子。,79,(4)零地址指令格式为:指令中只有操作码,不含操作数。这种指令有两种可能: 不需要操作数的指令。例如空操作指令、停机指令等。 所需操作数是隐含指定的。如计算机中对堆栈操作的运算指令,所需的操作数事先约

38、定在堆栈中,由堆栈指针SP隐含指出,操作结果仍送回堆栈中。又如Intel 80x86的串操作处理指令,其操作数是隐含指定的。,80,从上述讨论可知,指令格式中采用隐含指定操作数地址(即隐地址)能够有效地减少地址数,实际上缩短了指令码的长度,但是会增加指令译码的复杂性。上述几种指令格式只是一般情况,并非每台计算机都具有。例如在Intel 80x86的指令系统中,指令地址格式有零地址、一地址和二地址3种形式。三地址地址指令具有功能强、便于编程等特点。如RISC处理器以三地址指令为主,也设置少量二地址、一地址和零地址指令。,81,二. 缩短地址码的方法当前大多数计算机系统都采用虚拟存储器系统,为程序

39、提供更大的地址空间,这就要求指令中的访存操作数地址是一个逻辑地址(虚拟地址),其长度一般远超过实际主存的所需地址长度。因此,需要考虑如何用较短的地址码来表示一个较大的逻辑地址空间。下面讨论几种常用的缩短地址码的方法。,82,采用寄存器直接寻址,或寄存器间接寻址都可以有效地缩短地址码长度。例如,某机器有32个寄存器,每个寄存器长度是32位,一个寄存器地址只需要5位,如果采用寄存器间址,5位地址码就可以间接给出32位的存储器逻辑地址。 采用基址或变址寻址方式缩短地址码长度。由基址寄存器提供全字长的地址码,足以指向整个逻辑地址空间,运行时可以用基址寄存器装入某个主存区间或是程序段的首址,指令中的位移

40、量只是相对于首址的偏移量,位移量可以比较短。例如Intel 80x86实模式的位移量通常为8位或16位。,83,采用存储器间接寻址方式缩短地址长度。例如,主存储器按字节编址,将主存低1KB区域专门用来存放地址,如果逻辑地址需要32位,则用连续4个字节单元就可以存放32位地址,即1KB主存空间可以存放256个地址,在指令中用8位长度就可以表示32位地址。,84,2.3.3 指令格式设计实例,设计指令格式时,需要考虑指令的长度是采用固定的长度,还是采用可变长度。由于不同指令表示的信息量差异很大,可变长度指令就可以满足这样的需求,但是读取变长指令的时间会延长,而且指令越复杂执行时间也越长,实现也就更

41、复杂。反之,指令长度固定,格式简单,则读取与执行时间短,实现相对容易。目前多数复杂指令系统集计算机CISC都采用可变长度指令,如Intel 80x86系列。而精简指令系统计算机RISC则一般采用固定长度指令,如SPARC、MIPS。下面以典型的CISC的处理器Pentium II与RISC处理器SPARC为例讨论其指令格式。,85,一. Pentium II指令格式 Pentium的指令格式相当复杂:一是要与Intel 80x86兼容,而80x86的指令格式就比较复杂;二是Pentium对地址和数据的32位扩展,以及增加了寻址方式的灵活性。 图2-14给出了Pentium的指令格式,最多具有6

42、个变长域,只有操作码字段是必须出现的 。指令前缀一般根据需要选用,并放在指令前面。在Pentium机器码程序中,大部分指令并无前缀,它们使用默认的条件进行操作。,86,图2-14 Pentium指令格式,87,1、指令前缀部分,指令前缀有4种: 第1种包括4条前缀指令:LOCK、REP、REPE、REPNE。 第2种段指定,显式地指定该指令使用哪个寄存器。, 第3种操作数长度指定,用于寄存器数据宽度切换。 第4种地址长度指定,用于存储器地址宽度切换。,88,2、指令部分,指令本身包括以下字段: (1)OPCODE:定义指令类型,寄存器数据宽度,及操作结果存入寄存器还是存储器。 (2)MOD/R

43、M:分3个字段MOD、REG、RM。 REG(3位):定义一个寄存器寻址的操作数。 MOD(2位)与RM(3位):定义另一个操作数的寻址方式。包括8个寄存器寻址和24种存储器寻址。,89,(3)SIB 当MOD/RM=00/100时,使用SIB以说明比例变址寻址方式。 (4)DISP 如果MOD/RM定义的寻址方式需要位移量(即形式地址),由DISP字段给出,可以是8位、16位或32位。 (5)IMME 如果指令有立即数,由IMME给出,可以是8位、16位或32位。可见,Pentium II的指令格式很复杂,这一是因为要与80X86兼容;二是它的地址和数据扩展到32位。,90,Pentium指

44、令地址格式包括二地址、一地址和零地址3种形式。 在早期的80x86体系结构中,所有指令的操作码长度都是一个字节的长度。前缀字节作为额外的操作码附加在指令的最前面用于改变指令的操作。然而,在80x86体系结构发展的过程中,所有的操作码已经用完,因此操作码0xFF作为出口码(escape code),以表示本条指令的操作码是两字节的。 Pentium II的操作码通常需要完全译码后才能确定执行哪一类操作,同样,指令的长度也只有在操作码译码后才能知道,也就是译码后才能确定下一条指令的起始地址。这就使实现更高的性能如多条指令重叠或同时执行变得更为困难,这也是可变长度指令都存在的问题。,91,二. SP

45、ARC指令格式SPARC(Scalable Processor Architecture)是指由Sun公司定义的一种RISC处理器结构。,92,SPARC所有指令的长度固定为32位。其基本指令格式如下图:,指令最高两位操作码(op)定义指令格式,基本指令格式只有3种: *格式1专为CALL指令而设; *格式2为SETHI(置高位)和BRANCH(转移)指令而设; *常用算术逻辑指令、LOAD/STORE指令及其他指令均使用格式3 。,93,第2个操作码op2用于区分BRANCH、SETH等指令。第3个操作码op3是定义指令操作的,每条指令只定义一个单独的操作。opc是协处理机指令操作码,opf

46、是浮点处理机指令操作码。,指令格式3中,大多数指令的第1个源操作数rs1是寄存器操作数;第2个可能是寄存器rs2,也可能是立即数simm13;而目的地址一般均是寄存器rd(除了store和转移指令外)。整数算术逻辑运算指令是将rs1与rs2的内容(或simm13)按操作码op3规定的操作运算后把结果送往rd,其功能可以描述为: 当格式第13位i=0时,(rs1)op3(rs2)rd当i=1时,(rs1)op3 simm13rd,94,LOAD指令将存储器中的数据取出送到rd中,而STORE指令将rd中的数据存到存储器中。存储器地址的计算方法如下(寄存器间接寻址方式): 当i=0时,存储器地址(

47、rs1)(rs2)当i=1时,存储器地址(rs1)simm13,95,由于指令长度是32位,因此不能在指令中包括32位常量。SETHI指令只能设置22位常量,而把剩下的10位留给其他指令去实现。 非预取的条件转移指令使用格式2,由cond字段决定测试哪种条件。a位用于延迟转移控制,当a0时,跟在转移指令下面的指令总是被执行;当a=1时,只在条件转移指令转移成功时,跟在转移指令下面的指令才被执行。 格式1用于执行过程调CALL指令。这条指令很特别,其操作码只有两位,其余30位都用于定义地址。,96,随着技术的发展,新的指令格式被添加进来,新格式是通过把原来的一个字段分成不同的字段得到的。例如,最

48、初的转移指令使用格式2,有22位的偏移量。当加入分支预取指令时,22位中的3位被移作他用,其中1位用于预测(预测不预测),其他两位用于定义使用的条件码位集合,只剩下19位的偏移量。SPARC的指令格式、指令类型和寻址方式相对简单,可以认为是RISC体系结构的代表。,97,2.4 指令系统的改进,精简指令系统计算机RISC是20世纪80年代提出的一种新的设计思想。目前市场上很多处理机都采用了RISC体系结构,如SUN公司的SPARC、SuperSPARC、UtraSPARC,SGI公司的R4000、RS000、R10000,IBM公司的Power、PowerPC,Intel公司的80860、80

49、960,DEC公司的Alpha,Motorola公司的88100等。此外,一些典型的复杂指令系统计算机CISC的处理机设计时也吸收一些RISC的设计思想,如Intel公司的80486和Pentium系列。本节先介绍CISC、RISC的特点,然后以两个典型的RISC处理器MIPS R4000与SPARC为例,讨论其指令系统。,98,计算机的发展,使指令系统越来越庞大、复杂,这属于CISC复杂指令系统计算机。如,P6指令系统比8086除了在基本指令上有较大的增强外,还增加了57条MMX(Multi-Media eXtension)指令及70条流式SIMD扩展指令,随着Intel的PC机的不断升级,考虑与以前指令系统的兼容性,其指令系统必将不断扩张。,一. 从CISC到RISC,99,CISC指令系统存在的问题: 20与80规律CISC中,大约20的指令占据了80的处理机时间。8088处理机的指令种类约100种:前11种(11)指令的使用频度已经超过80 前8种(8)指令的运行时间已经超过80 前20种(20)指令:使用频度达到91.1,运行时间达到97.72 其余80指令:使用频度只有8.9,只占2.28的处理机运行时间,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报