计算机体系结构——第2章 指令系统

第2章 指令系统

  • 指令系统是计算机系统结构的主要组成部分
  • 凡是能够在机器上直接运行的目标程序都是由指令组成的
  • 在计算机系统的设计中,由硬件设计人员采用各种技术来实现指令系统;由软件设计人员使用指令系统来编制各种系统软件和应用软件,用这些软件来填补用硬件实现的指令系统与各种编程语言之间的语义差距。
  • 因此,指令系统是计算机系统中软件与硬件的一个主要分界面,是软件与硬件的桥梁。
  • 在计算机系统的结构设计中,指令系统的设计是十分关键的,它对计算机系统的性能有直接影响。

2.1 数据表示与数据类型

  • 数据类型是指计算机系统中可以使用和处理的各种数据的类型,例如,字符、布尔数、整数、实数、串、向量、栈、链表、队列、阵列、树、表和文件等。
  • 数据表示是指计算机硬件能够直接识别、可以被指令系统直接使用的数据类型。数据表示是数据类型中最常用的、相对比较简单的、基于硬件实现的那些数据类型,例如,定点数(整数)、逻辑数(布尔数)、浮点数(实数)、字符、字符串、堆栈和向量等。
  • 数据结构研究的是用软件来处理各种数据类型,研究这些数据类型的逻辑结构和物理结构之间的关系及相应的算法。
  • 因此,哪些数据类型用数据表示来实现,哪些数据类型用数据结构来实现,也是计算机系统中的一个软硬件功能分配问题和一个软硬件分界面。随着计算机系统的发展,这个软硬件分界面也在不断地上移。

2.2 浮点数据(未完)

浮点数据表示比定点数据表示的示数范围大大地扩大了,浮点数可以表示有限的实数。

2.2.1 浮点数表示

在这里插入图片描述
在这里插入图片描述
浮点数的示数范围是指:用有限的 q 位阶码和 p 位尾数能表示的数值大小的范围。任何一种浮点数表示方式的浮点数字长总是有限的,因此,任何一种浮点数表示的示数范围和可表示的浮点数个数是有限的,而且表示的浮点数在实数轴上是不连续的。

2.2.2 非负阶、规格化正尾数浮点数的示数范围

  1. 阶码值e的范围:
    非负阶、规格化正尾数的情况下,由于是非负阶:
  • 阶码值 e 的最小值应是 e 的 q 位二进制数全为“0”,即 e 的最小值为 e=0;
  • e 的最大值应是 q 位二进制位全为“1”,即 e 的最大值为 e=2q-1。
  1. 规格化正尾数值m的范围:

规格化正尾数是在正尾数小数点后的第 1 个 rm进制(如二进制)数数位不是 0 的数,又因为尾数全为“0”的数是机器零,不作为机器中可表示的数,所以:

  • 最小正尾数的值应是 rm 进制尾数的小数点后第 1 个 rm进制数数位为“1”,其余的数位皆为“0”的数值,即可表示的规格化正尾数的最小值为m=1*rm-1 =rm-1
    如二进制(rm=2),m=2-1

  • 最大正尾数的值应是 rm 进制尾数的各位数均为rm-1 的数;或者说当尾数的基为rm时,p位长的尾数的rm进制数的位数为p’=p/ ⎡log2rm ⎤ (二进制为2位,),那么,最大正尾数的值应是 rm进制数的第 p′位数位上加 1,即加上 rm-p’,就会使整个尾数值变为 1,因此,可表示的规格化正尾数 m 的最大值为 m=1- rm-p’
    如p=2,rm=2,p’=2/1=2
    最大正尾数m为第2位数位上加1,即加上2-2,加完得1,所以m=1-2-2
    (这里是规格化正尾数,所以对于正尾数是纯小数来说,机器里存的应该是小数点后的,p的位数应该是小数点后面的个数)
    (猜测:这里的p’应该是因为从机器里拿出来的是二进制数?后面规格规格化浮点数那用的是p,是因为那个进制的尾数是p位?)

  1. 浮点数最大最小值
  • 浮点数的值为 m× rme
  • 浮点数可表示的最小值应由阶码最小值 e=0 和尾数最小值 m=rm-1 决定,即浮点数可表示的最小值为 rm-1*r0=rm-1
  • 浮点数可表示的最大值应由阶码最大值 e=2q-1和尾数最大值 m=1- rm-p’决定,即浮点数可表示的最大值为在这里插入图片描述
  • 由此可以得出非负阶、规格化正尾数浮点数的示数范围为
    在这里插入图片描述

2.2.3 规格化浮点数的示数范围

  1. 在可表示浮点数的正数区间
  • 规格化浮点数的最大正数值尾数的最大正数值阶码的最大正数值组合而成;
  • 规格化浮点数的最小正数值尾数的最小正数值阶码的最小负数值组合而成。
  1. 在可表示浮点数的负数区间
  • 规格化浮点数的最大负数值尾数最大负数值阶码最小负数值组合而成;
  • 规格化浮点数的最小负数值尾数的最小负数值阶码的最大正数值组合而成。
    在这里插入图片描述
    (q位移码的最大值最小值)

2.2.4 规格化浮点数的表数个数

浮点数据表示在实数轴上可表示的实数的个数是有限的不连续的。
可表示的规格化浮点数的个数 = 可表示的阶码的个数 * 可表示的尾数的个数的乘积。

  • 阶码的基 re=2,则 q 位长的阶码可表示的阶码的个数为 2q个。
  • 尾数的基为 rm
    • p 位长的尾数可表示的 rm 进制数的位数为 p‘ = p / ⎡log2 rm ⎤ ,
    • 每个 rm进制数的数位均可以有0~ (rm-1)共rm个取值,所以,p′个数位可表示rm进制数的个数为 rm p′。但应去掉小数点后第一位是“0”的那些非规格化数,这些非规格化数的个数占全部可表示数的比例为 1/rm (二进制因为除了0.1XXX就是0.0XXX),
    • 由此,可得出 p 位长的尾数可表示的规格化尾数的个数为 rm p′ * (1-1/rm)
  • 所以,可得出可表示的规格化浮点数的个数为 2q * rm p′ * (1-1/rm)

2.2.5 规格化浮点数的表数精度(表数误差)

  • 主要与尾数的基r~m~ 的取值尾数的长度p有关
  • 在一般情况下,规格化尾数的最后一位的值通常由四舍五入来确定
  • 因此,可以认为表数误差是尾数的最后一位的值的一半
  • 由此可以得出规格化浮点数的表数精度为:
    在这里插入图片描述
    注意是-(p-1),因为小数点前要占一位(待确认)
    这为什么又p-1???我迷惑了
    p位到底包不包含小数点前一位?

2.2.6 浮点数机器字的格式设计

设计一种浮点数表示方式需要确定 6 个参数,这 6 个参数的确定原则分别如下:
① 尾数数值 m 的数制和码制。主要从运算简单、表数直观等方面来考虑,目前多数机器采用小数、原码表示 m。尾数数值 m 采用原码表示,虽然加减法比采用补码表示复杂,但乘除法简单得多。m 采用小数表示能简化运算,特别是乘除法。
② 阶码数值 e 的数制和码制。目前一般机器都采用整数、移码表示 e。e 采用移码表示的主要原因是使浮点数零与机器零一致。由于阶码主要是用来扩大浮点数的示数范围的,因此,e 必须用整数表示。
③ 尾数的基 rm的取值。可以证明:在浮点数机器字长一定的情况下,取 rm=2 时,浮点数有最大的示数范围和最高的表数精度。因此一般取 r~m~=2
④ 阶码的基 re的取值。在一般通用计算机中,都取 r~e~=2
⑤ 在浮点数表示方式中,尾数长度 p 主要影响表数精度阶码长度 q 主要影响示数范围。可根据要求满足的示数范围和表数精度确定 q 和 p 的值。
在这里插入图片描述

2.3 自定义数据表示

在这里插入图片描述

  • 数据的这些属性都要通过不同的指令操作码来解释,例如,完成两个数值相加的加法指令,就要根据数值的不同属性设计若干条加法指令分别各自完成属性不同的数值相加,从而大大增加了指令系统的负担。
  • 在高级语言中,数据的一种运算操作通常只用一种运算操作符,数据的属性必须在数据使用前给予定义,由编译器根据定义的数据属性生成不同的机器指令。高级语言与机器语言之间的这种语义差距是通过编译器的编译过程来填补的。
  • 自定义数据表示是指在机器语言中,由数据自己定义数据本身的属性,从而简化了指
    令系统和编译器。自定义数据表示主要有带标志符的数据表示和数据描述符数据表示。
  1. 带标识符的数据表示
    带标志符的数据表示是在数据中采用若干位来表示数据的属性。例如,在 R-2 计算机
    中采用带标志符的数据表示的数据字格式为:
    在这里插入图片描述
    每个数据带有 10 位标志符。
  • 2 位功能位用于区别数据是操作数、指令、地址还是控制字。
  • 2 位陷阱位可由软件定义 4 种捕捉方式,为程序员对程序进行跟踪控制提供方便。
  • 1 位读写位用于指定数据是只读还是可读可写。
  • 4 位类型位可在功能位定义的基础上进一步定义数据的类型。如果功能位定义了数据类型是操作数,则类型位进一步定义操作数是二进制数、十进制数、定点数、浮点数、字符串、单精度、双精度等。如果功能位定义了数据类型是地址,则类型位进一步定义地址的寻址方式等。
  • 最后 1 位是奇偶校验位。
  1. 数据描述符数据表示
    对于复杂的数据类型,例如,向量和矩阵一类的多维数组中各元素的数据属性是相同
    的,而且是连续存放的,没有必要让每个数据都带有相同的标志符。因此,在表示多维数组时可以采用数据描述符
    数据描述符与标志符的主要区别是
    (1) 标志符只作用于一个数据,而描述符要作用一组数据。
    (2) 因此,标志符通常与数值一起存放在同一个数据单元中,而描述符一般单独占用一个存储单元。
    (3) 描述符用来描述一组数据的属性中,还包括整个数据块的访问地址、长度及其他特征或信息。

2.4 寻址技术

寻址技术是指存储数据的空间如何编地址如何寻找地址的技术,前者称为编址方式,
后者称寻址方式。
在主机中,可存储数据的空间有:CPU 中的通用寄存器、主存储器、堆栈和 I/O 接口中的数据寄存器。由于这些存储空间的工作速度和存储容量差别很大,因此,采用的编址方式和寻址方式也不相同。

2.4.1 地址空间的组织方式(3种)

(1)3 个地址空间的组织方式(3个都独立编址)
存储空间的存储单位数量越多,用于存储单位编址的地址码越长。
CPU 中的通用寄存器数量较少
I/O 寄存器的数量稍多
主存存储单元的数量要大得多
为了减少指令中用于寻址的地址码长度,对这 3 个地址空间独立编址
这 3 个地址空间的寻址方式也不相同,

  • 对寄存器一般采用简单直接寻址方式
  • 对主存空间一般采用间接寻址和变址寻址等多种寻址方式,以避免在指令中直接表示主存单元的地址码。

(2)2 个地址空间的组织方式(1个独立编址,2个统一编址)
- CPU 的通用寄存器独立编址
- I/O 接口寄存器和主存储器统一编址。统一编址空间的高端地址一般用于 I/O 接口寄存器地址。

(3)1 个地址空间的组织方式(3个都统一编址)
所有数据存储单元统一编址,地址空间的低端地址是 CPU 的通用寄存器地址,高端地址是 I/O 接口寄存器地址。

2.4.2 编址单位

常用的编址单位有:字编址、字节编址和位编址。

  • 字编址是指每个编址单位与访问的数据存储单元相一致。
  • 字节编址是指每个编址单位都是 1 个字节。
  • 位编址是指每个编址单位都是 1 个二进制位。

对 CPU 通用寄存器的一次读/写访问,要求读出或写入通用寄存器中的一个字,因此:

  • 通用寄存器按字编址,寄存器的编号就是寄存器的地址码。
  • 主存储器可以按字编址,也可以按字节编址。按字编址是最容易实现的一种编址方式,在采用字编址的计算机中,可以设置专门的按字节操作的指令和按位操作的指令来实现对存储器中的指定字节或指定位进行操作。

2.4.3 寻址方式

按指令中包含的地址码的个数来分,指令可分为:一地址指令、二地址指令、三地址
指令和零地址指令。
根据指令中给出的地址码寻找数据存储单元的方式称为寻址方式。按指令的寻址空间来分,寻址方式可以分为以下 4 种。
(1)立即数寻址

  • 直接在指令的地址码部分给出操作数,使指令直接从指令字中获取操作数,不需要访问任何地址空间,指令执行速度很快
  • 缺点是指令字中的址址码长度有限,使操作数可表示的示数范围较小和表数精度较低

(2)寄存器寻址
若寻址空间是通用寄存器,则采用寄存器寻址方式。由于通用寄存器的工作速度较快,
因此寄存器寻址的执行速度较快。另外,由于通用寄存器的字长比指令字中的地址码的长
度要大得多,因此,寄存器中的操作数的示数范围和表数精度较大

(3)主存寻址

  • 若寻址空间是主存,则采用主存寻址方式,由于主存的工作速度较慢,因此主存寻址比较费时
  • 另外,由于主存的容量很大,使主存空间的地址码较长,而指令字中分配给地址码的位数很有限,特别在二地址指令和三地址指令中,这个矛盾更加突出。
  • 为了能使用有限长的指令地址码对相当大的主存空间寻址,在主存寻址方式中要采用间接寻址和变址寻址等寻址方式,这些寻址方式利用寄存器来存放操作数的主存单元地址,而在指令地址码中只需要给出相应的寄存器地址。指令执行时,先访问由指令地址码指定的寄存器,再从指定的寄存器中获得主存单元地址。

(4)堆栈寻址
由于堆栈中的数据只能先进后出,因此对堆栈空间寻址无需指明地址。标准的堆栈操作指令没有地址码部分。

2.5 指令格式优化设计

指令格式的优化是指如何用最短的二进制位数来表示指令的操作信息和地址信息,使指令的平均字长较短。
指令格式的优化设计首先根据指令集各指令的使用频度的分布{pi}对操作码进行优化设计,然后对地址码寻址方式的表示采取有关措施,使指令格式达到优化。经过优化设计的指令集减少了程序的总位数,减少了程序运行的时空开销,从而提高了系统的性能。

2.5.1 操作码优化设计的方法(定长编码、哈夫曼编码、扩展编码)

  1. 定长编码(等长编码)是指所有指令的操作码长度都是相等的。如果需要编码的操作码有 n 个,那么,定长操作码的位数最少需要 ⎡ log2n ⎤ 位。
  2. 哈夫曼(Huffman)编码使用哈夫曼算法构造哈夫曼树来进行编码。
    构造哈夫曼树的方法是:每次从结点集中选择出 2 个频度最小的结点,将其合并成频度为这 2 个频度之和的父结点,若结点集不为空集,就将生成的新结点放到结点集中,继续从这个新的结点集中选择出 2 个频度最小的结点生成其父结点,直至结点集成为一个空集,就生成了一棵哈夫曼树。对每个结点的两个分支分别用“0”和“1”标识,从根结点到一个叶结点的路径(由0 和 1 组成的序列)就是这个叶结点的哈夫曼编码。
    由于哈夫曼编码的码长种类较多,既不利于用硬件对操作码进行译码,也很难与地址码配合以形成长度规整的指令格式,因此,实用的操作码编码采用扩展编码方法。
  3. 扩展编码限定使用少数几种码长,频度高的码点用短码表示,频度较低的码点用长码表示。
    特别需要指出的是,短码都不能是长码的前缀,即任何短码都不能是任何长码的前若干位,否则会造成解码的不惟一性。因此,需要留下若干个短码作为长码的扩展标志,以便长码在扩展编码时使用。
    扩展编码有 2 种表示方法。
  • 一种称为码长表示法,用短横线前后的数字分别表示短码码长和长码码长,例如,2-4-6 表示编码有 3 种码长,分别是 2 位、4 位和 6 位。
  • 另一种称为码点数表示法,用斜线前后的数字分别表示短码码点个数和长码码点个数,例如,3/6/4表示有 3 种码长,最短码长的码点(?)个数是 3,最长码长的码点个数是 4。

2.5.2 操作码优化设计的评价方法

  1. 平均码长
    在这里插入图片描述
  2. 位冗余量
    在这里插入图片描述
    其中,H 称为信息熵(Entropy)
    在这里插入图片描述
    表示用二进制编码表示 n 个码点时,理论上的最短平均编码长度。因此,任何实际编码得出的平均码长 l 都有 l>H,故有 0<R<1。

对于同一个频度分布{pi},应用哈夫曼算法有可能生成不同的哈夫曼树,因此,由不
同的哈夫曼树得出各码点的编码值就不相同,也就是说,从频度分布{pi}得到的哈夫曼编码并不惟一。但是,计算的平均码长 l 肯定是惟一的
根据实现编码的码点个数的要求,在采用扩展编码方法进行优化设计时,选用多少个
短码作为长码扩展标志的原则:

  • 一是根据需要编码的短码码点个数和长码码点个数进行选择,
  • 二是尽量减少编码可表示的冗余码点数。总之,应尽可能达到平均码长 l 最短的优化
    要求。

2.5.3 指令字格式优化设计的措施

在这里插入图片描述

2.6 复杂指令系统计算机(CISC,Complex Instruction Set Computer)

计算机指令系统设计有两种截然不同的思想,这就是复杂指令集计算机(CISC)和精简指令集计算机(RISC)。

  • CISC 通过强化指令集功能,并实现软件功能向硬件功能转移,来提高计算机的性能。
  • RISC 通过尽可能地降低指令集结构的复杂性,来达到简化指令集的实现和提高性能的目的。

按 CISC 方向发展改进指令系统的基本思想是:如何进一步增强原有指令的功能,以及设置更为复杂的新指令来取代原先由软件子程序完成的功能,实现软件功能的硬化。它可以从面向机器语言目标程序的优化实现、面向高级语言的优化实现和面向操作系统的优化实现三个方面来改进指令系统。

1.面向机器语言目标程序优化实现改进的目标和途径
在这里插入图片描述
2. 面向高级语言优化实现改进的目标和途径
在这里插入图片描述
3. 面向操作系统优化实现改进的目标和措施
在这里插入图片描述

2.7 精简指令系统计算机(RISC,Reduced Instruction Set Computer)

2.7.1 CISC存在的问题

  • 指令系统日趋庞大和复杂,使机器的设计周期延长,成本升高,错误增多,可靠性降
    低;
  • 指令的译码和操作的复杂,使指令执行速度降低;
  • 高级语言源程序的优化编译变得困难,编译的时空开销增大;
  • 指令系统中,约有 80%的指令的使用频度很低,因此,指令系统的性能价格比低。

2.7.2 设计RISC机器的一般原则

  • 精简指令的条数;
  • 简化指令的格式,使指令字等长,并使所有指令都在一个机器周期执行完;
  • 扩大通用寄存器的数量,只让存、取两类指令访存,其他指令都只能对寄存器进行操作;
  • 指令的实现以硬联逻辑组合电路为主,少量指令可采用微程序解释;
  • 精心设计高质量的编译程序支持高级语言程序的优化编译。

2.7.3 设计RISC机器的基本技术

  • 按设计 RISC 机器的一般原则来精选和优化设计指令系统;
  • 指令的实现技术以采用硬联逻辑组合电路为主,适当辅以微程序解释;
  • 在 CPU 内设置大量的寄存器,并采用交叉寄存器窗口技术
  • 指令采用交叉和流水的方式解释执行,并采用延迟转移技术
  • 优化设计高质量的编译程序。

2.7.4 RISC的优点

  • 简化了指令系统的设计,适合于用 VLSI 来实现;
  • 提高了机器的运行速度和效率;
  • 降低了设计成本,提高了系统的可靠性;
  • 可以直接支持高级语言的实现,简化了编译程序。

2.7.5 RISC存在的问题及发展趋势

RISC 所存在的问题是:

  • 加重了汇编语言程序设计的负担;
  • 增加了目标程序占用的存储空间;
  • 对浮点运算和虚拟存储器等的支持还不够强;
  • 对编译程序的设计质量要求较高,难度较大。

今后,计算机的发展趋势是 RISC 和 CISC 互相结合,取长补短。

发布了16 篇原创文章 · 获赞 0 · 访问量 239

猜你喜欢

转载自blog.csdn.net/qq_42713936/article/details/104888815