§3 指令系统的设计和优化 指令系统是从程序设计者看到的机器的主要属性,是软、硬件的主要界面 指令系统是计算机系统结构的主要组成部分 §3 指令系统的设计和优化 指令系统是从程序设计者看到的机器的主要属性,是软、硬件的主要界面 指令系统是计算机系统结构的主要组成部分 指令系统是软件与硬件分界面的一个主要标志 指令系统是软件与硬件之间互相沟通的桥梁 指令系统与软件之间的语义差距越来越大 指令系统的设计主要包括指令的功能(操作类型、具体操作内容)和指令格式的设计.
内容 指令系统设计的基本原则 指令操作码的优化 指令字格式的优化
指令设计的步骤 根据应用,初拟出指令的分类和具体的指令; 试编出用该指令系统设计的各种高级语言的编译程序; 对各种算法白那些大量测试程序进行模拟测试,看指令系统的操作码和寻址方式效能是否都比较高; 将程序中高频出现的指令串复合改成一条强攻能新指令,即改用硬件方式实现;而将频度很低的指令的操作改成基本的指令组成的指令串来完成,即用软件方式实现;
指令类型 非特权型:主要供应应用程序员使用,也可供系统程序员使用,包括算术逻辑运算、数据传送、浮点运算、字符串、十进制运算、控制转移及系统控制等; 特权型:系统程序员使用,用户无权使用,有启动I/O(多用户环境下)、停机等待、存储管理保护、控制系统状态、诊断等;
指令系统的设计 设计的原则:如何支持编译系统能高效、简易地将源程序翻译成目标代码。 规整性 对称性 独立性和全能性 正交性 可组合性 可扩充性
系统设计人员希望 指令码密度适中 兼容性 适应性 高密度指令:强功能符合指令 优点:减少程序长度、访存次数、Cache、虚存访问调度次数、程序运行时间; 缺点:指令系统复杂,硬件实现困难; 兼容性 适应性
指令系统的设计包含的内容 指令的格式 指令的类型 操作功能 操作数的访问方式---寻址方式
指令的组成 一般的指令主要由两部分组成:操作码和地址码 操作码主要包括两部分内容: 地址码通常包括三部分内容: 操作种类:加、减、乘、除、数据传送、移位、转移、输入输出 操作数描述 数据的类型:定点数、浮点数、复数、字符、字符串、逻辑数、向量 进位制:2进制、10进制、16进制 数据字长:字、半字、双字、字节 地址码通常包括三部分内容: 地址:直接地址、间接地址、立即数、寄存器编号、变址寄存器编号 地址的附加信息:偏移量、块长度、跳距 寻址方式:直接寻址、间接寻址、立即数寻址、变址寻址、相对寻址、寄存器寻址
指令设计要考虑的问题 操作数的存储形式 存储器 CPU内什么地方 每条指令中显式说明的操作数个数 操作数的位置 操作类型 操作数的类型和长短
指令的分类
指令格式的优化 指令=操作码+地址码 指令格式的优化:如何用最短的位数来表示 指令的操作信息和地址信息,使程序中指 令的平均字长最短。 主要目标: 节省程序的存储空间 指令格式尽量规整,便于译码
操作码的优化表示 操作码的三种编码方法: 固定长度: 规整性好,解码简单,空间大。 Huffman编码:空间小,规整性不好,解码复杂。 固定长度: 规整性好,解码简单,空间大。 IBM公司的大中型机:最左边8位为操作码 Intel公司的Intanium处理机:14位定长操作码 许多RISC处理机采用定长操作码 Huffman编码:空间小,规整性不好,解码复杂。 扩展编码: 折衷方案。 固定长度 4 Huffman编码 2.12 扩展编码 3.12 信息源熵 2.09
改进操作码编码方式能够节省程序存储空间 例如:Burroughs公司的B-1700机 操作码 编码方式 整个操作系统所用 指令的操作码总位数 改进的 百分比 8位定长编码 4-6-10扩展编码 Huffman编码 301,248 184,966 172,346 39% 43%
哈夫曼(Huffman)压缩 当各种事件发生的概率不均等时,采用优化技术对发生概率最高的事件用最短的位数(时间)来表示(处理),而对出现概率较低的允许用较长的位数(时间)来表示(处理),以达到平均位数减少的目的。 用于代码压缩、程序压缩、空间压缩和时间压缩
操作码的优化表示 信息源熵:信息源包含的平均信息量。 信息冗余量:
举例 七条指令,频度如下 I1 I2 I3 I4 I5 I6 I7 0.4 0.3 0.15 0.05 0.04 0.03 0.03 信息源熵H=2.17 信息冗余量=0.28=28%
1.00 0.60 0.30 0.15 0.06 0.03 0.04 0.05 0.40 0.09 1 (11111) (11110) (11101) (11100) (110) (10) (0) I7 I6 I1 I2 I3 I4 I5
扩展编码 Huffman操作码的主要缺点: 扩展编码法:由固定长操作码与Huffman编码法相结合形成 操作码长度很不规整,硬件译码困难 与地址码共同组成固定长的指令比较困难 扩展编码法:由固定长操作码与Huffman编码法相结合形成 减少平均长度 方便译码
上例:Huffman用四种长度 0,10,110,11100,11101,11110,11111 I1、I2、I3用两位:00、01、10 I4、I5、I6、I7用四位: 1100、1101、1110、1111 平均码长=2.30 信息冗余量=0.0565=5.65%
Huffman编码方法 写出每个事件出现频度 找出两个时间出现频度最低的数字,相加形成新的频度
说明 目的:平均码长减少。 Huffma代码不唯一 0,1对换 合并次序
举例1 假设一台模型计算机共有7种不同的操作码,如果采用固定长操作码需要3位。已知各种操作码在程序中出现的概率如下表,计算采用Huffman编码法的操作码平均长度,并计算固定长操作码和Huffman操作码的信息冗余量。 利用Huffman树进行操作码编码的方法,又称为最小概率合并法。 指令 I1 概率 0.45 I2 0.30 I3 0.15 I4 0.05 I5 0.03 I6 0.01 I7
把所有指令按照操作码在程序中出现的概率,自左向右从排列好。 选取两个概率最小的结点合并成一个概率值是二者之和的新结点,并把这个新结点与其它还没有合并的结点一起形成新结点集合。 在新结点集合中选取两个概率最小的结点进行合并,如此继续进行下去,直至全部结点合并完毕。 最后得到的根结点的概率值为1。 每个结点都有两个分支,分别用一位代码“0” 和“1”表示。
从根结点开始,沿尖头所指方向,到达属于该指令的概率结点,把沿线所经过的代码组合起来得到这条指令的操作码编码。 解:采用Huffman编码法所得到的操作码的平均长度 =0.45×1+0.30×2+0.15×3+0.05×4 +0.03×5+0.01×6+0.01×6=1.97(位) 熵H=0.45×1.152+0.30×1.737+0.15×2.737 +0.05×4.322+0.03×5.059+0.01×6.644 +0.01×6.644=1.95(位)
0.45 0.30 0.15 0.05 0.03 0.01 1.00 0.55 0.25 0.10 0.02 1
指令序号 概率 Huffman编码法 操作码长度 I1 0.45 1位 I2 0.30 10 2位 I3 0.15 110 3位 I4 0.05 1110 4位 I5 0.03 11110 5位 I6 0.01 111110 6位 I7 1111111 采用3位固定长操作 码的信息冗余量为:
例如:把上例改为1-2-3-5扩展编码法,其操作码最短平均长度为:. H. =. 45×1+0. 30×2+0. 15×3+. (0
7条指令的操作码扩展编码法 序号 概率 1-2-3-5扩展编码 I1 0.45 I2 0.30 10 I3 0.15 110 I4 0.05 I2 0.30 10 I3 0.15 110 I4 0.05 11100 I5 0.03 11101 I6 0.01 11110 I7 11111 2-4等长扩展编码 00 01 1100 1101 1110 1111 平均长度 2.0 2.2 信息冗余量 2.5% 11.4% 7条指令的操作码扩展编码法
举例2:二~十进制代码压缩 2位二~十进制代码可表示0~99 a b c d e f g h 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1
写出概率表 ae=00, g=0.8*0.8=0.64 ae=01, g=0.2*0.8=0.16 ae=10, g=0.8*0.2=0.16 ae=11, g=0.2*0.2=0.04
画出Huffman代码树,写出代码表 ae状态 概率 Huffman代码 0 0 0.64 1 0 0.16 1 1 0 1 1 0 0 0 0 0.64 1 0 0.16 1 1 0 1 1 0 0 1 1 0.04 1 0 1
写出压缩代码表 ae=00 0 b c d f g h ae=10 b=c=0 1 1 x d f g h ae=01 f=g=0 1 0 0 d b c h ae=11 b=c=f=g=0 1 0 1 d x x h
操作码等长扩展编码法
指令字格式的优化 为了不降低访存取指令的速度,按整数边界存储。 操作数地址的位数 从寻址范围看:越大越好 用各种方法,压缩操作码的位数 通过采用多种不同的寻址方式、地址制、地址形式和地址码长度以及多种指令字长,将它们与可变长操作码的优化表示相结合,可构成冗余度尽可能少的指令字。
等长地址码发挥不出操作码优化表示的作用 limax 地址码 空白浪费 limin li
在定长指令字内实现多种地址制 地址码 操作码
寻址方式中必须支持使用频率较高的寻址方式,相关参数必须满足90%以上的使用频率。 基础:初步设计的指令集。 目标:减少指令长度,提高指令性能。 优化原则: 采用高概率优先思想,对高频率指令,缩短指令长度,提高效率,对低频率指令,主要满足功能要求; 地址码长度富裕时,采用不同的寻址方式或不同的地址制,增加功能; 地址码长度紧张时,采用特定的寻址方式或增加指令字长,满足功能。 寻址方式中必须支持使用频率较高的寻址方式,相关参数必须满足90%以上的使用频率。
地址码的优化表示 地址码个数的选择 地址码个数通常有3个、2个、1个及0个等4种情况 评价指令中地址码个数应该取多少的标准主要有两个: 程序存储容量,包括操作码和地址码 程序执行速度,以程序执行过程中访问主存的信息量代表
举例:计算一个典型的算术表达式 用三地址指令编写的程序如下 MUL X, A, B ;X←(A)×(B) ADD X, X, C ;X←(X)+(C) SUB X, X, D ;分子的计算结果在中 ADD Y, E, F ;计算分母,存入 YDIV X, X, Y ;最后结果在X单元中
用普通二地址指令编写的程序 MOVE X, A ;复制临时变量到X中 MUL X, B ADD X, C SUB X, D ;X中存放分子运算结果 MOVE Y, E ;复制临时变量到Y中 ADD Y, F ;Y中存放分母运算结果 DIV X, Y ;最后结果在X单元中
用多寄存器结构的二地址指令编写程序 MOVE R1, A ;操作数a取到寄存器R1中 MUL R1, B ADD R1, C SUB R1, D ;R1中存放分子运算结果 MOVE R2, E ADD R2, F ;R2中存放分母运算结果 DIV R1, R2 ;最后结果在R1中 MOVE X, R1 ;最后结果存入X中
用一地址指令编写的程序 LOAD E ;先计算分母, ;取一个操作数到累加器中 ADD F ;分母运算结果在累加器中 STORE X ;保存分母运算结果到X中 LOAD A ;开始计算分子 MUL B ADD C SUB D ;累加器中是分子运算结果 DIV X ;最后运算结果在累加器中 STORE X ;保存最后运算结果到X中
用0地址指令编写程序:ab*c+d-ef+/ PUSH A ;操作数a压入堆栈 PUSH B ;操作数b压入堆栈 MUL ;栈顶两数相乘,结果压回堆顶 PUSH C ADD PUSH D SUB ;栈顶是分子运算的结果 PUSH E PUSH F DIV ;栈顶是最后运算的结果 POP X ;保存最后运算结果
关于地址码个数结论 对于一般商用处理机,采用多寄存器结构的二地址指令是最理想的。 如果强调硬件结构简单,并且以连续运算(如求累加和等)为主,宜采用一地址结构。 对于以向量、矩阵运算为主的处理机,最好采用三地址结构。RISC处理机采用三地址指令 对于解决递归问题为主的处理机,宜采用零地址结构。编程容易、节省程序存储量。
缩短地址码长度的方法 用一个短地址码表示一个大地址空间 用间址寻址方式缩短地址码长度方法: 用变址寻址方式缩短地址码长度 在主存储器的低端开辟一个专门存放间接地址的区域 用变址寻址方式缩短地址码长度 变址寻址方式中的地址偏移量比较短, 用寄存器间接寻址方式缩短地址码长度 例如:16个间址寄存器,用4位地址码就能表示很长的逻辑地址空间。