1/75▲2.1指令集结构的分类2.2寻址方式2.3指令集结构的功能设计2.4操作数的类型和大小2.5指令格式的设计2.6MIPS指令集结构第2章计算机指令集结构2/75▲1.区别不同指令集结构的主要因素CPU中用来存储操作数的存储单元的类型2.CPU中用来存储操作数的存储单元的主要类型堆栈累加器通用寄存器组3.将指令集结构分为三种类型2.1指令集结构的分类3/75▲2.1指令集结构的分类堆栈结构累加器结构通用寄存器结构根据操作数的来源不同,又可进一步分为:寄存器-存储器结构(RM结构)(操作数可以来自存储器)寄存器-寄存器结构(RR结构)(所有操作数都是来自通用寄存器组)也称为load-store结构,这个名称强调:只有load指令和store指令能够访问存储器。4/75▲2.1指令集结构的分类4.对于不同类型的指令集结构,操作数的位置、个数以及操作数的给出方式(显式或隐式)也会不同。显式给出:用指令字中的操作数字段给出隐式给出:使用事先约定好的存储单元5.4种指令集结构的操作数的位置以及结果的去向ALUCPU存储器堆栈结构…ALUALUALU…TOS……………………………累加器结构通用寄存器结构(RM)通用寄存器结构(RR)(a)(b)(c)(d)灰色块:操作数黑色块:结果TOS(TopOfStack):栈顶6/75▲2.1指令集结构的分类例:表达式C=A+B在4种类型指令集结构上的代码。假设:A、B、C均保存在存储器单元中,并且不能破坏A和B的值。堆栈累加器寄存器(RM型)寄存器(RR型)pushAloadAloadR1,AloadR1,ApushBaddBaddR1,BloadR2,BaddstoreCstoreR1,CaddR3,R1,R2popCstoreR3,C7/75▲2.1指令集结构的分类6.通用寄存器结构现代指令集结构的主流在灵活性和提高性能方面有明显的优势跟其他的CPU内部存储单元一样,寄存器的访问速度比存储器快。对编译器而言,能更加容易、有效地分配和使用寄存器。寄存器可以用来存放变量。(1)减少对存储器的访问,加快程序的执行速度;(因为寄存器比存储器快)8/75▲2.1指令集结构的分类(2)用更少的地址位(相对于存储器地址来说)来对寄存器进行寻址,从而有效地减少程序的目标代码的大小。7.根据ALU指令的操作数的两个特征对通用寄存器型指令集结构进一步细分ALU指令的操作数个数3个操作数的指令两个源操作数、一个目的操作数2个操作数的指令其中一个操作数既作为源操作数,又作为目的操作数。9/75▲2.1指令集结构的分类ALU指令中存储器操作数的个数可以是0~3中的某一个,为0表示没有存储器操作数。ALU指令中存储器操作数的个数ALU指令中操作数的最多个数结构类型机器实例03RRMIPS,SPARC,Alpha,PowerPC,ARM12RMIBM360/370,Intel80x86,Motorola680003RMIBM360/37022MMVAX33MMVAX8.ALU指令中操作数个数和存储器操作数个数的典型组合11/75▲2.1指令集结构的分类9.通用寄存器型指令集结构进一步细分为3种类型寄存器-寄存器型(RR型)寄存器-存储器型(RM型)存储器-存储器型(MM型)10.3种通用寄存器型指令集结构的优缺点表中(m,n)表示指令的n个操作数中有m个存储器操作数。指令集结构类型优点缺点寄存器-寄存器型(0,3)指令字长固定,指令结构简洁,是一种简单的代码生成模型,各种指令的执行时钟周期数相近与指令中含存储器操作数的指令集结构相比,指令条数多,目标代码不够紧凑,因而程序占用的空间比较大寄存器-存储器型(1,2)可以在ALU指令中直接对存储器操作数进行引用,而不必先用load指令进行加载。容易对指令进行编码,目标代码比较紧凑指令中的两个操作数不对称。在一条指令中同时对寄存器操作数和存储器操作数进行编码,有可能限制指令所能够表示的寄存器个数。指令的执行时钟周期数因操作数的来源(寄存器或存储器)不同而差别比较大存储器-存储器型(2,2)或(3,3)目标代码最紧凑,不需要设置寄存器来保存变量指令字长变化很大,特别是3操作数指令。而且每条指令完成的工作也差别很大。对存储器的频繁访问会使存储器成为瓶颈。这种类型的指令集结构现在已不用了13/75▲1.一种指令集结构如何确定所要访问的数据的地址?2.当前的指令集结构中所采用的一些操作数寻址方式:赋值操作Mem:存储器Regs:寄存器组方括号:表示内容Mem[]:存储器的内容Regs[]:寄存器的内容Mem[Regs[R1]]:以寄存器R1中的内容作为地址的存储器单元中的内容2.2寻址方式寻址方式指令实例含义寄存器寻址AddR4,R3Regs[R4]←Regs[R4]+Regs[R3]立即值寻址AddR4,#3Regs[R4]←Regs[R4]+3偏移寻址AddR4,100(R1)Regs[R4]←Regs[R4]+Mem[100+Regs[R1]]寄存器间接寻址AddR4,(R1)Regs[R4]←Regs[R4]+Mem[Regs[R1]]索引寻址AddR3,(R1+R2)Regs[R3]←Regs[R3]+Mem[Regs[R1]+Regs[R2]]直接寻址或绝对寻址AddR1,(1001)Regs[R1]←Regs[R1]+Mem[1001]存储器间接寻址AddR1,@(R3)Regs[R1]←Regs[R1]+Mem[Mem[Regs[R3]]]自增寻址AddR1,(R2)+Regs[R1]←Regs[R1]+Mem[Regs[R2]]Regs[R2]←Regs[R2]+d自减寻址AddR1,-(R2)Regs[R2]←Regs[R2]-dRegs[R1]←Regs[R1]+Mem[Regs[R2]]缩放寻址AddR1,100(R2)[R3]Regs[R1]←Regs[R1]+Mem[100+Regs[R2]+Regs[R3]*d]15/75▲2.2寻址方式采用多种寻址方式可以显著地减少程序的指令条数,但可能增加计算机的实现复杂度以及指令的CPI。16/75▲2.2寻址方式1%0%24%43%32%6%16%3%17%55%1%6%11%39%40%0%10%20%30%40%50%60%70%存储器间接寻址缩放寻址寄存器间接寻址立即数寻址偏移寻址TexSpicegcc立即数寻址方式和偏移寻址方式的使用频度最高。3.各种寻址方式的使用情况统计结果在VAX机器上运行gcc、Spice和Tex基准程序17/75▲2.2寻址方式4.偏移量的取值范围在load-store结构的机器(Alpha)上运行SPECCPU2000基准程序0%占偏移寻址方式的百分比5%10%15%20%25%30%35%40%12034567891012131415整数浮点1118/75▲2.2寻址方式从该图可以看出:程序所使用的偏移量大小分布十分广泛主要是因为在存储器中所保存的数据并不是十分集中,需要使用不同的偏移量才能对其进行访问。较小的偏移量和较大的偏移量均占有相当大的比例19/75▲2.2寻址方式5.立即数寻址方式立即数寻址方式的使用频度指令类型使用频度整型平均浮点平均load指令23%22%ALU指令25%19%所有指令21%16%大约1/4的load指令和ALU指令采用了立即数寻址。20/75▲2.2寻址方式立即数的取值范围0%立即数的百分比5%10%15%20%25%30%35%40%12034567891012131415整数浮点1145%21/75▲2.2寻址方式最常用的是较小的立即数;有时也会用到较大的立即数(主要是用于地址计算)。在指令集结构设计中,至少要将立即数的大小设置为8~16位。在VAX机(支持32位立即数)上做过类似的统计,结果表明20%~25%的立即数超过16位。22/75▲1.指令集结构的功能设计确定软、硬件功能分配,即确定哪些基本功能应该由硬件实现,哪些功能由软件实现比较合适。2.在确定哪些基本功能用硬件来实现时,主要考虑3个因素:速度、成本、灵活性硬件实现的特点速度快、成本高、灵活性差软件实现的特点速度慢、价格便宜、灵活性好2.3指令集结构的功能设计23/75▲2.3指令集结构的功能设计3.对指令集的基本要求完整性、规整性、高效率、兼容性完整性:在一个有限可用的存储空间内,对于任何可解的问题,编制计算程序时,指令集所提供的指令足够用。要求指令集功能齐全、使用方便下表为许多指令集结构都包含的一些指令类型前4类属于通用计算机系统的基本指令对于最后4种类型的操作,不同指令集结构的支持大不相同。24/75▲2.3指令集结构的功能设计操作类型实例算术和逻辑运算算术运算和逻辑操作:加,减,乘,除,与,或等数据传输load,store控制分支,跳转,过程调用和返回,自陷等系统操作系统调用,虚拟存储器管理等浮点浮点操作:加,减,乘,除,比较等十进制十进制加,十进制乘,十进制到字符的转换等字符串字符串移动,字符串比较,字符串搜索等图形像素操作,压缩/解压操作等25/75▲2.3指令集结构的功能设计规整性:主要包括对称性和均匀性。对称性:所有与指令集有关的存储单元的使用、操作码的设置等都是对称的。例如:在存储单元的使用上,所有通用寄存器都要同等对待。在操作码的设置上,如果设置了A-B的指令,就应该也设置B-A的指令。均匀性:指对于各种不同的操作数类型、字长、操作种类和数据存储单元,指令的设置都要同等对待。例如:如果某机器有5种数据表示,4种字长,两种存储单元,则要设置5×4×2=40种同一操作的指令。26/75▲2.3指令集结构的功能设计高效率:指指令的执行速度快、使用频度高。4.在设计指令集结构时,有两种截然不同的设计策略。(产生了两类不同的计算机系统)CISC(复杂指令集计算机)增强指令功能,把越来越多的功能交由硬件来实现,并且指令的数量也是越来越多。RISC(精简指令集计算机)尽可能地把指令集简化,不仅指令的条数少,而且指令的功能也比较简单。27/75▲2.3指令集结构的功能设计1.CISC结构追求的目标强化指令功能,减少程序的指令条数,以达到提高性能的目的。2.增强指令功能主要是从以下几个方面着手:面向目标程序增强指令功能增强运算型指令的功能增强数据传送指令的功能增强程序控制指令的功能丰富的程序控制指令为编程提供了多种选择。2.3.1CISC指令集结构的功能设计28/75▲2.3指令集结构的功能设计例如:循环在程序中占有相当大的比例,所以在指令上提供专门的支持。循环控制部分通常用3条指令完成:一条加法指令一条比较指令一条分支指令设置循环控制指令,用一条指令完成上述3条指令的功能。I=m1I=I+m3循环体I>m2一般循环程序的结构29/75▲2.3指令集结构的功能设计面向高级语言的优化实现来改进指令集(缩小高级语言与机器语言的语义差距)高级语言与一般的机器语言的语义差距非常大,为高级语言程序的编译带来了一些问题。(1)编译器本身比较复杂。(2)编译生成的目标代码比较难以达到很好的优化。30/75▲2.3指令集结构的功能设计面向微程序机器级传统机器高级语言程序高级语言机器间接执行高级语言机器直接执行高级语言机器解释编译汇编编译解释解释解释31/75▲2.3指令集结构的功能设计增强对高级语言和编译器的支持对源程序中各种高级语言语句的使用频度进行统计与分析,对使用频度高、执行时间长的语句,增强有关指令的功能,加快这些指令的执行速度,或者增加专门的指令,可以达到减少目标程序的执行时间和减少目标程序长度的目的。增强系统结构的规整性,减少系统结构中的各种例外情况。(面向高级语言的计算机)32/75▲2.3指令集结构的功能设计高级语言计算机①间接执行高级语言机器高级语言成为机器的汇编语言,这时高级语言和机器语言是一一对应的。用汇编的方法把