1.63k likes | 1.81k Views
第二章 指令系统. 本章内容. 2.1 数据表示 2.1.1 浮点数表示 2.1.2 自定义数据表示 2.2 寻址技术 2.2.1 编址方式 2.2.2 寻址方式 2.2.3 程序在主存中的定位方法. 本章内容. 2.3 指令格式的设计和优化 2.3.1 指令操作码的优化 2.3.2 地址码的优化表示 2.3.3 指令格式设计实例 2.4 指令系统的改进 2.4.1 RISC 与 CISC 的概述 2.4.2 RISC 指令系统实例 习题二. 第二章 指令系统.
E N D
本章内容 • 2.1 数据表示 • 2.1.1浮点数表示 • 2.1.2 自定义数据表示 • 2.2 寻址技术 • 2.2.1 编址方式 • 2.2.2 寻址方式 • 2.2.3 程序在主存中的定位方法
本章内容 • 2.3 指令格式的设计和优化 • 2.3.1 指令操作码的优化 • 2.3.2 地址码的优化表示 • 2.3.3 指令格式设计实例 • 2.4 指令系统的改进 • 2.4.1 RISC与CISC的概述 • 2.4.2 RISC指令系统实例 • 习题二
第二章指令系统 • 指令系统是硬件和软件之间的接口,硬件设计人员采用各种技术来实现指令系统;软件设计人员基于指令系统来编制相应的系统软件,这些软件用来填补硬件实现的指令系统与各种编程语言之间的语义差距。指令系统是计算机系统的软硬件功能分配的界面,指令系统设计是计算机系统结构设计的核心,它对计算机系统的性能有直接影响。 • 指令系统实际上定义了硬件和编译器之间的接口,它是一种硬件和编译器都能理解的语言。一方面,指令系统表明了一台计算机具有哪些硬件功能,是硬件逻辑设计的基础。因此,在指令系统层,应该定义一套在当前和将来技术条件下能够高效率实现的指令集,从而使高效率的设计可用于今后的若干代计算机中。另一方面,指令系统应该为编译器提供明确的编译目标,使编译结果具有规律性和完整性。
第二章指令系统 • 指令系统是硬件和软件之间的接口,硬件设计人员采用各种技术来实现指令系统;软件设计人员基于指令系统来编制相应的系统软件,这些软件用来填补硬件实现的指令系统与各种编程语言之间的语义差距。指令系统是计算机系统的软硬件功能分配的界面,指令系统设计是计算机系统结构设计的核心,它对计算机系统的性能有直接影响。 • 指令系统实际上定义了硬件和编译器之间的接口,它是一种硬件和编译器都能理解的语言。一方面,指令系统表明了一台计算机具有哪些硬件功能,是硬件逻辑设计的基础。因此,在指令系统层,应该定义一套在当前和将来技术条件下能够高效率实现的指令集,从而使高效率的设计可用于今后的若干代计算机中。另一方面,指令系统应该为编译器提供明确的编译目标,使编译结果具有规律性和完整性。
第二章指令系统 • 本章主要介绍与指令系统直接有关的数据表示,然后阐述指令系统优化设计的方法和技术,最后讨论指令系统发展中的CISC(复杂指令系统计算机)和RISC(精简指令系统计算机)两种设计思想,并介绍典型RISC处理器MIPS R4000和SPARC的指令系统。
2.1 数据表示 • 数据表示是数据类型中最常用的、相对比较简单的、易于硬件实现的那些数据类型。相对较复杂的数据类型,如表、树、队列、链表等则是由软件来处理,它们是数据结构研究的对象。数据结构和数据表示是软、硬件的交界面。系统结构设计在软、硬件功能分配时,应考虑在机器中设置哪些数据表示,以便对应用中的数据结构有高的实现效率,这是以花费适当的硬件为代价的。 • 由于基本的数据表示在其他课程已有详细阐述,本节介绍主要更深入地介绍浮点数表示涉及到的一些问题,以及自定义数据表示。
2.1.1浮点数表示 • 现代的大部分计算机都引入了浮点数据表示,典型的长度有32位和64位。浮点数表示的关键问题是,在数据字长确定的情况下,能设计出一种具有最佳表示范围、表示精度和表示效率的浮点数表示方式。 1. 浮点数的表示范围 • 在机器中,典型的浮点数机器字格式如图2-1所示。
2.1.1浮点数表示 • 图2-1中,浮点数机器字代码由两部分组成:阶码部分和尾数部分。阶码部分包含了阶符和阶码值两部分。尾数部分包括数符和尾数值。浮点数的值可表示为: • 图2-1中,浮点数机器字代码由两部分组成:阶码部分和尾数部分。阶码部分包含了阶符和阶码值两部分。尾数部分包括数符和尾数值。浮点数的值可表示为: 其中
2.1.1浮点数表示 • 浮点数表示需要确定以下6个参数: • ① 尾数的基rm • 尾数表示可以采用用二进制、四进制、八进制、十六进制和十进制等,即尾数的基rm可分别取值为2、4、8、16、10等。 • ② 尾数的值m • 尾数的值可以采用原码或补码表示,数值可以采用小数或整数表示。 • ③ 尾数长度n • 尾数占用的二进制位数称为尾数长度,不包括符号位。
2.1.1浮点数表示 • 尾数的基为rm,尾数长度为n可表示的rm进制数的位数为 。当尾数采用二进制即rm=2时,尾数长度n就是;如果尾数采用十六进制,则需要4位二进制数表示1位十六进制数,这时十六进制尾数的实际位数为 =n/4 • ④ 阶码的基re • 阶码一般采用二进制表示,即阶码的基re=2。 • ⑤ 阶码的值e • 阶码的值e一般采用移码或补码表示,数值采用整数表示。 • ⑥ 阶码长度q • 由于阶码采用二进制,因此,阶码长度q的值就是阶码部分的二进制数位数。注意q不包括阶码符号位。
2.1.1浮点数表示 • 从式(2-1)可以看出,浮点数的表示范围与尾数的基值rm有关,也与阶码位数q和尾数位数p以及采用的机器数表示形式有关。 • 由于机器字长的限制,任何一种浮点数的表示范围和可表示的浮点数个数是有限的,浮点数只能表示出数轴上分散于正、负两个区间上的部分离散值,如图2-2所示。
2.1.1浮点数表示 • 在浮点数表示的正数区间:规格化浮点数的最大正数值Nmax由尾数的最大正数值与阶码的最大正数值组合而成;规格化浮点数的最小正数值Nmin由尾数的最小正数值与阶码的最小负数值组合而成。在浮点数表示的负数区间:规格化浮点数的最大负数值(-Nmax)由尾数最大负数值与阶码最小负数值组合而成;规格化浮点数的最小负数值(-Nmin)由尾数的最小负数值与阶码的最大正数值组合而成。
2.1.1浮点数表示 • 在尾数采用原码、纯小数,阶码采用移码、整数的浮点数表示方式中,规格化浮点数的表示范围N正和N负为:
2.1.1浮点数表示 • 当尾数采用补码、纯小数,阶码采用移码、整数的浮点数表示方式中,规格化浮点数在正数区间完全相同,但是负数区间有区别,N负的表示范围为: 从以上公式可以看出,浮点数的表示范围与尾数的基值rm有关,也与阶码位数q和尾数位数p以及采用的机器数表示形式有关。但是,影响浮点数表示范围的主要因素是尾数基值rm和阶码位数q。
2.1.1浮点数表示 • 例2-1 浮点数长度32位,数符1位和阶符1位,阶码长度q=6,尾数长度n=24,尾数和阶码采用二进制,即rm= re=2。尾数采用原码、纯小数,阶码采用移码、整数,其规格化浮点数表示范围为: 即
2.1.1浮点数表示 • 例2-2 浮点数长度32位,数符1位和阶符1位,阶码长度q=6,尾数长度n=24,尾数采用十六进制和阶码采用二进制,即rm=16,re=2。尾数采用原码、纯小数,阶码采用移码、整数,给出其规格化浮点数表示范围。 解:由于尾数采用十六进制,24位二进制表示6位十六进制数,故浮点数表示范围为: 即
2.1.1浮点数表示 • 从上述两个例子可以看出,当浮点数阶码尾数的二进制位数、码制、小数点位置都相同时,则浮点数表示范围由基值rm决定,基值rm越大表示范围越大;但是,基值rm越大,浮点数在数轴上的分布越稀。 2.规格化浮点数的表数个数 • 由于字长限制,浮点数表示方式所能表示的浮点数个数是有限的、不连续的。可表示的规格化浮点数的个数应该是可表示的阶码的个数与可表示的尾数的个数的乘积。 • 如果阶码的基re=2,则q位长的阶码可表示的阶码的个数为2q个。
2.1.1浮点数表示 尾数的基为rm,n位长的尾数可表示的rm进制数的位数为,每个rm进制数的数位均可以有 共有rm个取值,所以,尾数的总个数为,但应去掉小数点后第1个进制数位是0的那些非规格数。显然,非规格化尾数的个数占了全部尾数总个数的的比例。因此,可表示的浮点数规格化数的总个数就为。 由此推出可表示的规格化浮点数的个数为:
2.1.1浮点数表示 • 可以推出,越大,在与 =2的浮点数相重叠的范围内,所表示数的个数要少得多,即数的密度分布会更稀。 3.规格化浮点数的表数精度 • 浮点数表示方式所能表示的浮点数个数是不连续的、有限的,只能表示出实数中很少的一部分,是实数的一个子集,称为浮点数集。 • 浮点数集的表数误差指的是浮点数集中两个最接近的浮点数之间的误差。在浮点运算中,会出现运算中间结果或最后结果的尾数不在浮点集中的情况(不是溢出),这时必须用最接近这个结果的浮点数表示。如,浮点加法运算过程中,对阶操作需要对一个浮点数进行右规时,就要对尾数的最低位进行舍入,通常采用四舍五入来确定最低位的值,这时就产生了误差。
2.1.1浮点数表示 • 表数误差也称为表数精度。规格化浮点数的表数精度直接与尾数基rm的取值和rm进制的尾数位数有关。规格化浮点数运算中,如果需要对尾数的最低位进行处理,通常采用四舍五入的规则,因此,可以认为表数误差是尾数的最后一位的值的一半。由此可以得出规格化浮点数的表数精度为: (2-3)
2.1.1浮点数表示 • 根据式(2-3),可以得出例2-1和例2-2中两种不同尾数基值浮点数的表数精度分别为: • 比较以上的两个浮点数的表数精度,可以看出尾数基值rm=16时,其表数精度与rm=2相比将损失23倍。显然,当浮点数尾数的二进制位数长度相同时,尾数基值rm为2具有最高的表数精度。
2.1.1浮点数表示 • 4.浮点数机器字的格式设计 • 定义一种浮点数机器字的格式需要确定浮点数表示的6个参数,具体原则如下: • ① 确定尾数m的数制和码制。主要从运算简单、表数直观等方面来考虑,目前多数机器尾数m采用小数、原码表示。尾数m采用原码表示,虽然加减法比采用补码表示复杂,但乘除法要简单得多。 • ② 确定阶码e的数制和码制。目前一般机器阶码e都采用整数、移码表示。阶码e采用移码表示的主要原因是使浮点数零与机器零一致,而且移码的大小直接反映了阶码真值的大小,这便于两个浮点数的阶码比较。由于阶码主要是用来扩大浮点数的示数范围的,因此,阶码e必须用整数表示。
2.1.1浮点数表示 • ③确定尾数的基rm。前面的讨论表明在浮点数机器字长一定的情况下,取rm=2时,浮点数有最高的表数精度。目前多数机器尾数基值rm取2。 • ④ 确定阶码的基re。在一般通用计算机中,都取re=2。 • ⑤ 在浮点数表示方式中,尾数长度n主要影响表数精度,阶码长度q主要影响示数范围。可根据要求的示数范围和表数精度确定n和q的值。 • 按照目前多数实际机器的情况,假设:浮点数尾数m用原码、小数表示,阶码e用移码、整数表示,尾数基值rm=2,阶码基值re=2。要求浮点数表示范围不小于N(N为可表示的最大正数),表数精度不低于,确定q和n的值的方法如下。
2.1.1浮点数表示 • 根据浮点数表示范围的要求,可得下式: • 解这个不等式: • 得到阶码长度q为: (2-4)
2.1.1浮点数表示 • 根据浮点数表示精度要求,可得下式: • 故得出尾数长度n为: (2-5) 由(2-4)和(2-5)两个不等式得出的阶码长度q和尾数长度n,再加上一个尾数符号位mf和一个阶码符号位ef,就组成了一种满足以上假设浮点数表示范围和表数精度的浮点数机器字格式。一般为了使浮点数机器字字长满足整数边界的要求,还需要适当调整q和n的值。
2.1.1浮点数表示 • 例2-3 设浮点数尾数m用原码、小数表示,阶码e用移码、整数表示,尾数基值rm=2,阶码基值re=2。要求规格化浮点数的表示范围N为,要求浮点数表数精度不低于,试设计一种浮点数的格式。 根据浮点数表示范围的要求,用式(2-4)计算阶码的长度q:
2.1.1浮点数表示 • 考虑到要满足整数边界,可取阶码长度位。 • 根据浮点数表数精度要求,用式(2-5)计算尾数长度n: • 考虑到要满足整数边界,可取尾数长度n=54位。
2.1.1浮点数表示 • 此例中,阶码长度q=7位,尾数长度n=54位,再加上1位尾数符号位和1位阶码符号位,则浮点数机器字字长为2+q+n=63位,距离机器字字长的整数边界要求还差1位。这一位可以加到尾数长度n上用以提高表数精度,也可以加到阶码长度q上用以扩大示数范围。如果将这1位加到尾数长度上,则设计的64位浮点数机器字格式如图2-3所示。
2.1.2自定义数据表示 • 在数据表示上,高级语言与机器语言一直存在语义差距。高级语言中,在引用数据之前必须用类型说明语句定义数据类型,其运算符不反映数据类型,是通用的。如在C语言程序中,有以下语句: • int i,j • float x,y • i=i+j • x=x+y
2.1.2自定义数据表示 • 由此可见,i、j是整型数据,x、y是实型数据, 运算符“+”可用于整型也可用于实型数据相加。然而,一般的机器语言程序则完全不同,指令中是由操作码定义操作数据的类型。如浮点数加法机器指令: • 以上指令中,操作码是浮点加,指定对操作数X和Y进行浮点加法运算,无论X和Y是否是浮点数,都是按浮点数对待。因此,编译时就需要把高级语言程序中的数据类型说明语句和运算符转换成机器语言中不同类型指令的操作码,并要验证指令中操作数的类型是否与运算符所要求的一致,若不一致,还需用进行处理,从而增加了编译程序的复杂性。
2.1.2自定义数据表示 • 为了在数据表示上缩小高级语言与机器语言的语义差距,有人提出在机器语言级实现自定义数据表示,即由数据本身定义自己的类型,同时也简化了指令系统和编译器。 • 自定义数据表示主要有带标志符的数据表示和数据描述符数据表示。 • 1. 带标志符的数据表示 • 带标志符的数据表示是指在数据中采用若干位来表示数据的类型。
2.1.2自定义数据表示 • 如早期的B7500大型机中,每个数据用三位标志符来区分8种数据类型,如图2-4所示。 • 标志符虽然主要用于指明数据类型,也可用于指明所用信息类型。二十世纪70年代的R-2计算机中,采用带标志符的数据表示的数据字格式如图2-5所示。
2.1.2自定义数据表示 • 图2-5中, 共有10位标志,2位功能位用于区别数据是操作数、指令、地址还是控制字。2位陷阱位用于软件定义4种捕捉方式,为程序员对程序进行跟踪控制提供方便。1位读写位用于指定数据是只读的还是可读可写的。4位类型位可在功能位定义的基础上进一步定义数据的类型。如果功能位定义了数据类型是操作数,则类型位进一步定义操作数是二进制数、十进制数、定点数、浮点数、字符串、单精度、双精度等。如果功能位定义了数据类型是地址,则类型位进一步定义地址的寻址方式等。最后1位标志位是奇偶校验位。
2.1.2自定义数据表示 • 标志符数据表示缩小了高级语言和机器语言语义差距,但是数据字因增设标志符,会增加程序所占的主存空间,而且按标志符确定数据属性及判断操作数之间是否相容等操作,会降低单条指令的执行速度。 • 2.数据描述符数据表示 • 对于一组具有相同类型而且是连续存放的数据,如向量、矩阵和多维数组,没有必要让每个数据都带有相同的标志符,因此,可以采用数据描述符。
2.1.2自定义数据表示 • 数据描述符与标志符的主要区别是:标志符只作用于一个数据,而描述符要作用于一组数据。因此,标志符通常与数值一起存放在同一个数据单元中,而描述符一般单独占用一个存储单元。描述符在描述一组数据的属性中,还包括整个数据块的访问地址、长度及其他特征或信息。 • B6700计算机的描述符如图2-6所示,前三位为“000”,表示该字为数据;前三位为“101”,表示该字为数据描述符。如果该字是数据描述符,则进一步用8位标志位描述数据特性。如果描述的是整块数据时,“地址”字段用于指明首元素的地址,“长度”字段用于指明块内的元素个数。
2.1.2自定义数据表示 (a) 数据描述符 (b) 数据 图2-6 B6700机中数据描述符表示
2.1.2自定义数据表示 • 可以将描述符按树型连接以描述多维数组表示。例如,有一个3×4二维阵列A: • 图2-7表示了用数据描述符描述A阵列的情况,具体使用了两级描述符,一级描述符一个,二级描述符是连续存放的三个描述符,描述符的前三位都为101。 a00 a01 a02 a03 A = a10 a11 a12 a13 a20 a21 a22 a23
2.1.2自定义数据表示 • 一级描述符的“长度”位为3,指向有3个元素的二级描述符的首址;每个二级描述符的“长度”位都为4,分别指向对应的有4个元素的数据。实际上,两级描述符构成了一颗双层树。类似的,用三层结构的描述符就可以描述三维数组。 • 图2-7中,二维阵列A是一条指令的一个操作数,指令中的一个地址X指向描述A阵列的一级描述符,OP表示操作码。
2.1.2自定义数据表示 图2-7 用数据描述符表示一个3×4二维阵列
2.2寻址技术 • 从指令系统层来看,程序所处理的数据通常存放在主存储器、寄存器、堆栈、I/O接口中,寻址技术就是指如何从这些存储部件中获得数据的技术。寻址技术主要讨论存储部件的编址方式、寻址方式和定位方式。 • 在“计算机组成原理”课程中对指令的各种寻址方式有详细的介绍,在本节我们更注重于分析和比较它们的特点。
2.2.1编址方式 • 要访问存放在主存储器、寄存器、堆栈、I/O接口中的数据,必须对这些存储部件的空间进行编址。编址方式主要涉及编址单位和编址空间。 • 1. 编址单位 • 存储空间常用的编址单位有:字编址、字节编址和位编址。 • 字编址是指每个编址单位与访问的数据存储单元(如读/写一次寄存器、主存单元)相一致,即每个编址单元的二进制位数与一次访问存储部件所获的二进制位数是相同的。这种方式硬件实现容易,但是不便于处理非数值(如字符)信息。目前仍然有一些面数值计算的机器采用这种编址方式。
2.2.1编址方式 • 字节编址是指以1个字节作为编址单位。这是目前大多数通用计算机采用的编址方式,以适应非数值计算的应用需求。 • 位编址是指以1个二进制位作为编址单位。在很多单片机中,有的存储器区域和控制寄存器可以按位编址,同时它们也按字节编址,对位进行访问或操作是用位操作指令完成。单片机主要用于嵌入式系统的硬件控制,使用位操作指令可以很方便地对I/O端口的位进行处理。 • 多数机器按字节编址,但是通常主存储器的字长是4个字节以上,而且多数机器允许按字节、单字、双字访问存储器,因此编址单位与访问存储器的信息宽度不一致,从而产生数据如何在存储器中存放的问题。
2.2.1编址方式 • 如某台机器,按字节编址,数据有字节(8位)、半字(双字节)、单字(4字节)和双字(8字节)不同宽度。主存数据宽度64位,即一个存储周期可访问8个字节。采用按字节编址,大于字节宽度的数据是用该数据的首字节地址来寻址的。一种存放数据的方法是,在主存中允许数据从任意字节地址单元存放,如图2-8(a)所示,这种方法很容易出现一个数据跨主存宽度边界存储的情况;对于跨界存放的数据,即使数据宽度小于或等于主存宽度,也需要两个存储周期才能访问到,导致访问速度显著下降。
2.2.1编址方式 • 另一种数据存放方法是,要求数据在主存中存放的地址必须是该数据宽度(字节数)的整数倍,即双字地址的最低3个二进制位必须为000,单字地址最低2位必须为00,半字地址最低1位必须为0,如图2-8(b)所示。这种存放方法也称为按整数边界存储方式,它可以使访问任意宽度的数据都只用一个存储周期。虽然浪费了一些存储空间,但是速度比上一种方法有显著提高。
图2-8 数据在主存中的存放方式 (a)数据按任意字节地址存放
图2-8 数据在主存中的存放方式 (b)数据按整数边界存放
2.2.1编址方式 • 2. 编址空间的组织 • 计算机中需要编址的存储部件主要有:通用寄存器、主存储器和I/O接口。它们的编址空间可以有以下3种组织方式。 • (1)三个地址空间 • 由于通用寄存器、主存储器和I/O接口的工作速度和容量等性能差别较大,很多机器中对这3个地址空间进行独立编址。也就是说,每个地址空间都从0开始编地址码。 • CPU中的通用寄存器数量有限,访问速度很快,其容量比主存储器小得多,所需要的地址码长度短。一般只有单一的直接寻址方式。
主存储器的容量大,所需要的地址码长度很长。采用的寻址方式最复杂,一般有间接寻址和变址寻址等多种寻址方式,以避免在指令中直接表示主存单元的地址码。主存储器的容量大,所需要的地址码长度很长。采用的寻址方式最复杂,一般有间接寻址和变址寻址等多种寻址方式,以避免在指令中直接表示主存单元的地址码。 • I/O接口中的寄存器的数量一般比通用寄存器多,其地址码长度介于寄存器和主存之间,因此多采用直接寻址方式,也有机器采用寄存器间址方式。 • 三个地址空间独立编址,由于每个地址空间都从0开始编码,因此三个空间会有重叠,但是指令的操作码和寻址方式会明确指出所访问的是哪个地址空间。访问I/O地址空间则需要设置专用的I/O指令。如Intel 80x86系列就采用三个地址空间独立编址。
(2)二个地址空间 • CPU的通用寄存器独立编址;I/O接口寄存器和主存储器统一编址,统一编址空间的高端地址一般用于I/O接口寄存器地址。采用二个地址空间的组织方式,访问主存的指令就能访问I/O寄存器,可以减少指令条数,但存在的问题是主存的地址空间会减小。如VAX-11系列机就采用二个地址空间的组织方式。 • (3)一个地址空间 • 所有数据存储单位统一编址,地址空间的低端地址是CPU的通用寄存器地址,高端地址是I/O接口寄存器地址。在单片机中,片内存储器容量不大,一般采用一个地址空间,以减少指令种数。 • 计算机中的一些专用寄存器或寄存器堆,如预取指令和数据的缓冲器,是不需要编址的。Cache存储器映射的是相联的主存内容,因此不需要编址。在堆栈型计算机中,数据的存取完全按照先进后出的方式进行,其存储部件是不需要编址的。