资源描述
单击此处编辑母版标题样式,2014.2.17,计算机系统结构,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第2章 指令系统的设计,本章主要内容,(1)指令操作码的优化(不讲),(2),RISC,技术简介,(3),MIPS,指令集,(4),MIPS,模拟器(补充),2014.2.17,1,计算机系统结构,2.4.2,RISC,技术简介(,P44),名词:,RISCReduced Instruction Set Computing,,精简指令集计算机,(1),RISC,产生的背景:20%与80%规律,(2),RISC,设计的基本原则:,只设置最常用的简单指令,凡遇复杂操作均用多条简单指令实现;,指令长度固定,操作码与操作数长度都尽量统一;,基本指令的启动时间间隔降低到1个时钟周期;,访问主存只有,load,和,store,指令,用变址寻址;,尽量采用硬连逻辑对指令译码;,为了加快执行速度,在编译过程中对目标代码结构进行优化;,(3),RISC,性能优势的原因,采用,RISC,技术的主要动机是使各条指令的执行时序尽可能一致,,CPU,在执行时间上可以把它们安排得更紧凑,就像许多大小相近的箱子容易被堆放得更密集一样。这样机器内的各种资源可以充分利用,单位时间内能执行更多的指令,速度更快。,这方面的具体内容,在第3章讲流水线时会详细介绍。,2014.2.17,2,计算机系统结构,2.4.2,RISC,技术的发展,20世纪,70年代初,,IBM,研究中心的,John Cocke,证明,计算机中约20%的指令承担了80%的工作,1974年,他提出,RISC,的概念。,在,RISC,的早期研究中,加州大学伯克利分校(,UC Berkeley,)和斯坦福大学(,Stanford),提出了许多有创见的新思想。伯克利率先在1982年完成了,RISC I,型32位芯片的设计,斯坦福大学则在,John Hennessy(,现任校长)带领下于1983年完成了第一个采用,RISC,理念的商用,MIPS,微处理器,。,1984年,Hennessy,等人创建了,MIPS,计算机公司,1998年改名为,MIPS,技术公司(美普思科技公司,,MIPS Technologies Inc),,目前是美国最著名的芯片设计公司之一。,MIPS,技术公司本身不生产微处理器,它只设计高性能工业级的32位和64位,CPU,的结构体系,并且向其它半导体公司提供使用其内核(,IP),的授权,用于生产基于,MIPS,而又各具特色的微处理器。1999年,MIPS,技术公司发布了,MIPS32,和,MIPS64,架构标准。,MIPS,的通用微处理器主要用于构建高性能工作站、服务器和超级计算机系统,其嵌入式产品在1999年以前全球销量第一,目前也仅次于,ARM,。,2014.2.17,3,计算机系统结构,2.6.1,MIPS,的寄存器(,P47),32个64位通用寄存器(,GPRs,),,也称为整数寄存器,名称是,R0,R1,R31(,也可写为,$0,,,$,1,,$,31,),R0,的值永远是0,可用作源寄存器,也可作为无用结果的目的寄存器;,R31,用于存放跳转并链接类指令的返回地址。,32个64位浮点数寄存器(,FPRs,),F0,F1,F31,用来存放32个单精度浮点数(32位),也可以用来存放32个双精度浮点数(64位)。,存储单精度浮点数(32位)时,只用到,FPR,的一半,其另一半没用。,特殊功能寄存器,PC(program counter,,程序计数寄存器),HI(,整数乘除结果高位寄存器,除法余数),LO(,整数乘除结果低位寄存器,除法的商,),它们可以与通用寄存器交换数据。,浮点状态寄存器:用来保存有关浮点操作结果的信息。,2014.2.17,5,计算机系统结构,MIPS,的寄存器别名(程序员习惯用法),MIPS,编译器支持一些专业程序员对,32,个,通用寄存器,GPR(GENERAL PURPOSE REGISTER),约定的习惯性用法(非强制的):,REGISTER NAMEUSAGE,$0$zero,常量0(,constant value 0),$2-$3$v0-$v1,函数调用返回值(,values for results and expression evaluation),$4-$7$a0-$a3,函数调用参数(,arguments),$8-$15$t0-$t7,暂时的(或随便用的),$16-$23$,s0-$s7,保存的(或如果用,需要,SAVE/RESTORE,的)(,saved),$24-$25$t8-$t9,暂时的(或随便用的),$26-$27$k0-$k1,由操作系统的异常或中断处理程序使用,$28$,gp,全局指针(,Global Pointer),$29$sp,堆栈指针(,Stack Pointer),$30$fp,帧指针(,Frame Pointer),(BNN:fp is stale acutally,and can be simply used as$t8),$31$ra,返回地址(,return address),2014.2.17,6,计算机系统结构,2.6.2 MIPS,的数据表示,整数,字节(8位)半字(16位),字(32位)双字(64位),浮点数,单精度浮点数(32位)双精度浮点数(64位),字节、半字或者字在装入64位寄存器时,用零扩展或者用符号位扩展来填充该寄存器的剩余部分。装入以后,对它们将按照64位整数的方式进行运算。,2014.2.17,7,计算机系统结构,2.6.3 MIPS,的数据寻址方式(,P47),立即数寻址与偏移量寻址;,立即数字段和偏移量字段都是16位的。,寄存器间接寻址是通过把0作为偏移量来实现的;,16位绝对寻址是通过把,R0(,其值永远为0)作为基址寄存器来完成的;,MIPS,的存储器按字节寻址,地址为64位;,所有存储器访问必须是边界对齐的,即访问地址必须是该数据长度(字节数)的整倍数,又叫整数边界原则;,MIPS,的存储器按字节编制;,所有数据字、指令字从最高有效位开始依次标记为,bit 0、1、2,;,MIPS,处理器的存储顺序,可以设置为“小端字节表示顺序”(,Littile,-,Endian,,,低位字节放在低地址,),或者“大端字节表示顺序”(,Big-,Endian,,,高位字节放在低地址,以便适合网络数据包内顺序,)。,在下文使用的,MIPS64,模拟器中采用“小端字节表示顺序”。,2014.2.17,8,计算机系统结构,2.6.4,MIPS,指令格式(,P48),MIPS32,和,MIPS64,体系结构定义了兼容的32位和64位处理机指令,使用条件编译或宏汇编指令能写出可同时在,MIPS32,和,MIPS64,上运行的程序,寻址方式编码到操作码中,所有的指令都是,32,位的,操作码占,6,位,3,种指令格式(3,种格式中,同名字段的位置固定不变),2014.2.17,9,计算机系统结构,2.6.4,MIPS,指令格式,I,类指令,包括所有的,load,和,store,指令,立即数指令,分支指令,寄存器跳转指令,寄存器链接跳转指令。,立即数字段为16位,用于提供立即数或偏移量。,load,指令 访存有效地址:,Regs,rs,immediate,从存储器取来的数据放入寄存器,rt,store,指令 访存有效地址:,Regs,rs,immediate,要存入存储器的数据放在寄存器,rt,中,立即数指令,Regs,rt,Regs,rs,op immediate,分支指令 转移目标地址:,Regs,rs,immediate,,rt,无用,寄存器跳转、寄存器跳转并链接 转移目标地址为,Regs,rs,2014.2.17,10,计算机系统结构,2.6.4,MIPS,指令格式,R,类指令,包括,ALU,指令,专用寄存器读/写指令,,move,指令等。,ALU,指令,Regs,rd,Regs,rs,funct Regs,rt,funct,为具体的运算操作编码,2014.2.17,11,计算机系统结构,2.6.4,MIPS,指令格式,J,类指令,包括跳转指令,跳转并链接指令,自陷指令,异常返回指令。,在这类指令中,指令字的低26位是偏移量,它与,PC,值相加形成跳转的地址。,2014.2.17,12,计算机系统结构,2.6.5,MIPS,的操作(,P49),MIPS,指令可以分为四大类,load,和,store,ALU,操作,分支与跳转,浮点操作,符号的意义,x,n,y,:,从,y,传送,n,位到,x,x,yz:,把,z,传送到,x,和,y,下标:表示字段中具体的位;,对于指令和数据,按从最高位到最低位(即从左到右)的顺序依次进行编号,最高位为第0位,次高位为第1位,依此类推。,下标可以是一个数字,也可以是一个范围。,例如:,Regs,R4,0,:,寄存器,R4,的符号位,Regs,R4,56-63,:R4,的最低字节,2014.2.17,13,计算机系统结构,2.6.5,MIPS,的操作(续,),Mem,:,表示主存;,按字节寻址,可以传输任意个字节。,上标:用于表示对字段进行复制的次数。,例如:0,32,表示一个32位长的全0字段,符号#:用于两个字段的拼接,并且可以出现在数据传送的任何一边。,举例,:,R8、R6,是64位的寄存器,下式,Regs,R8,32-63,32,(,Mem,Regs,R6,0,),24,#,Mem,Regs,R6,表示的意义是:以,R6,的内容作为地址访问内存,得到的字节按符号位扩展为32位后存入,R8,的低32位,,R8,的高32位(即,Regs,R80-31),不变。,2014.2.17,14,计算机系统结构,load,和,store,指令,指令举例,指令名称,含 义,LD R2,20(R3),装入双字,RegsR2,64,Mem20+RegsR3,LW R2,40(R3),装入字,RegsR2,64,(Mem40+RegsR3,0,),32,#Mem40+RegsR3,LB R2,30(R3),装入字节,RegsR2,64,(Mem30+RegsR3,0,),56,#Mem30+RegsR3,LBU R2,40(R3),装入无符号字节,RegsR2,64,0,56,#Mem40+RegsR3,LH R2,30(R3),装入半字,RegsR2,64,(Mem30+RegsR3,0,),48,#,Mem30+RegsR3#Mem31+RegsR3,L.S F2,60(R4),装入单精度浮点数,RegsF2,64,Mem60+RegsR4#0,32,L.D F2,40(R3),装入双精度浮点数,RegsF2,64,Mem40+RegsR3,SD R4,300(R5),保存双字,Mem300+RegsR5,64,RegsR4,SW R4,,,300(R5),保存字,Mem300+RegsR5,32,RegsR4,S.S F2,,,40(R2),保存单精度浮点数,Mem40+RegsR2,32,RegsF2,031,SH R5,,,502(R4),保存半字,Mem502+RegsR4,16,RegsR5,48.63,2014.2.17,15,计算机系统结构,ALU,指令,寄存器寄存器型(,RR,型)指令或立即数型,算术和逻辑操作:加、减、与、或、异或和移位等,R0,的值永远是0,它可以用来合成一些常用的操作。,例如:,DADDIU R1,R0,#100,给寄存器,R1,装入常数100,DADD R1,R0,R2,把寄存器,R2,中的数据传送到寄存器,R1,指令举例,指令名称,含义,DADDUR1,,,R2,,,R3,无符号加,RegsR1 RegsR2+RegsR3,DADDIU R4,,,R5,,,#6,加无符号立即数,RegsR4 RegsR5+6,LUIR1,,,#4,把立即数装入到一个字的高16位,RegsR1 0,32,#4#0,16,DSLLR1,,,R2,,,#5,逻辑左移,RegsR1 RegsR25,DSLT R1,R2,R3,置小于,If(RegsR2 RegsR3),RegsR1 1 else RegsR10,2014.2.17,16,计算机系统结构,2.6.6 MIPS,的控制指令(,P50),由一组跳转和一组分支指令来实现控制流的改变,典型的,MIPS,控制指令,指令举例,指令名称,含义,J name,跳转,PC,3663,name2,JAL name,跳转并链接,RegsR31PC+4,;,PC,3663,name,2;,(PC+4)2,27,)name(PC+4)+2,27,),JALR R3,寄存器跳转并链接,RegsR31PC+4,;,PC RegsR3,JR R5,寄存器跳转,PC RegsR5,BEQZ R4,name,等于零时分支,if(RegsR4=0)PCname ;,(PC+4)2,17,)name(PC+4)+2,17,),BNE R3,R4,name,不相等时分支,if(RegsR3!=RegsR4)PCname,(PC+4)2,17,)name(PC+4)+2,17,),MOVZ R1,,,R2,,,R3,等于零时移动,if(RegsR3=0)RegsR1,RegsR2,2014.2.17,17,计算机系统结构,跳转指令,根据跳转指令确定目标地址的方式不同以及跳转时是否链接,可以把跳转指令分成,4,种。,确定目标地址的方式,把指令中的26位偏移量左移2位(因为指令字长都是4个字节)后,替换程序计数器的低28位;,间接跳转:由指令中指定的一个寄存器来给出转移目标地址。,跳转的两种类型,简单跳转:把目标地址送入程序计数器。,跳转并链接:把目标地址送入程序计数器,把返回地址(即顺序下一条指令的地址)放入寄存器,R31,。,2014.2.17,18,计算机系统结构,分支指令(条件转移),分支条件由指令确定,例如:测试某个寄存器的值是否为零,提供一组比较指令,用于比较两个寄存器的值。,例如:“置小于”指令,有的分支指令可以直接判断寄存器内容是否为负,或者比较两个寄存器是否相等。,分支的目标地址,由16位带符号偏移量左移两位后和,PC,相加的结果来决定,一条浮点条件分支指令:通过测试浮点状态寄存器来决定是否进行分支。,2014.2.17,19,计算机系统结构,2.6.7,MIPS,的浮点操作(,P51),由操作码指出操作数是单精度(,SP),或双精度(,DP),后缀,S:,表示操作数是单精度浮点数,后缀,D:,表示是双精度浮点数,浮点操作,包括加、减、乘、除,分别有单精度和双精度指令。,浮点数比较指令,根据比较结果设置浮点状态寄存器中的某一位,以便于后面的分支指令,BC1T(,若真则分支)或,BC1F(,若假则分支)测试该位,以决定是否进行分支。,2014.2.17,20,计算机系统结构,注意浮点数的存储格式只有64位双精度这一种,没有32位单精度数。,MIPS64,伪指令,2014.2.17,21,计算机系统结构,MIPS64,指令集1,2014.2.17,22,计算机系统结构,MIPS64,指令集2,2014.2.17,23,计算机系统结构,MIPS64,指令集3,2014.2.17,24,计算机系统结构,MIPS64,指令集4,2014.2.17,25,计算机系统结构,MIPS64,指令集5,2014.2.17,26,计算机系统结构,MIPS64,指令集6,2014.2.17,27,计算机系统结构,MIPS64,模拟器介绍1,2014.2.17,28,计算机系统结构,MIPS64,模拟器介绍2,2014.2.17,29,计算机系统结构,MIPS64,模拟器介绍3,2014.2.17,30,计算机系统结构,MIPS64,模拟器的存储器映射,I/O,地址与命令,CONTROL:.word32 0 x10000;,控制寄存器(映射地址),DATA:.word32 0 x10008;,数据寄存器(映射地址),Set CONTROL=1,将,DATA,作为无符号整型数输出,Set CONTROL=2,将,DATA,作为有符号整型数输出,Set CONTROL=3,将,DATA,作为浮点数输出,Set CONTROL=4,将,DATA,作为输出字串的首地址,Set CONTROL=5,将,DATA+5,作为,x,坐标,,DATA+4,作为,y,坐标,,DATA,作为,RGB,彩色值输出,Set CONTROL=6,清除终端屏幕,Set CONTROL=7,清除图形屏幕,Set CONTROL=8,从键盘读,DATA,(,整型数或浮点数),Set CONTROL=9,从,DATA,读1字节,无字符回显,数据地址,0,x00000,程序存储器,程序起点,lwu r24,DATA(r0),lwu r25,CONTROL(r0),指令地址,0,x00000,数据存储器,常规数据区,0,x10000,0,x10008,sd r9,0(r24),sd r2,0(r25),控制寄存器,数据寄存器,仿真非智能终端,2014.2.17,31,计算机系统结构,MIPS64,模拟器演示实验1,整数加法,文件名:,sum.s,.,data,A:.word 10,B:.word 8,C:.word 0,.text,main:,ld r4,A(r0);r4(A),ld r5,B(r0);r5(B),dadd r3,r4,r5;r3r4+r5,sd r3,C(r0);Cr3,halt,2014.2.17,32,计算机系统结构,MIPS64,模拟器演示实验2,阶乘1,文件名:,factorial.s,;,;,阶乘示例,;,返回值放,r10,;,.data,number:.word 10;,此数未用,可能想作为输入值的上限,title:.asciiz“factorial program n=“;,提示字符串,CONTROL:.word32 0 x10000,DATA:.word32 0 x10008,.text,lwu r21,CONTROL(r0);r21,指向,CONTROL,单元(端口),lwu r22,DATA(r0);r22,指向,DATA,单元(端口),2014.2.17,33,计算机系统结构,MIPS64,模拟器演示实验2,阶乘2,daddi r24,r0,4;,输出,ascii,字串(提示信息),daddi r1,r0,title,sd r1,(r22),sd r24,(r21),daddi r24,r0,8;,从键盘读输入值到,r1(,整型量),sd r24,(r21),ld r1,(r22),start:daddi r29,r0,0 x80;r29,指向堆栈区起点(十进制值=128),jal factorial;,调阶乘子程序,返回值在,r10(,整型量),daddi r24,r0,1;,输出,r10,的结果,sd r10,(r22),sd r24,(r21),halt;,停机,2014.2.17,34,计算机系统结构,MIPS64,模拟器演示实验2,阶乘3,;,;,阶乘子程序,入口参数在,r1,,返回值在,r10,;,factorial:slti r10,r1,2;,如果,r12(,即,r1=1),则,r101,,否则,r100,bnez r10,out;,如果,r10=1,则子程序返回,sd r31,(r29);,子程序返回地址压进堆栈,daddi r29,r29,8;,堆栈指针+8,sd r1,(r29);r1,当前值压进堆栈,daddi r29,r29,8;,堆栈指针+8,daddi r1,r1,-1;r1r11,jal factorial;,递归调用,将乘数序列依次入栈(,n,3,2),2014.2.17,35,计算机系统结构,MIPS64,模拟器演示实验2,阶乘4,dadd r4,r0,r10;,递归出口(首次,r10=1),r4r10,daddi r29,r29,-8;,堆栈指针8,ld r3,(r29);,出栈:,r3,栈顶单元,dmulu r3,r3,r4;r3r3r4,dadd r10,r0,r3;r10,乘积,r3,daddi r29,r29,-8;,堆栈指针8,ld r31,0(r29);r31,返回地址,out:jr r31;,子程序返回到,r31,所指的地址,2014.2.17,36,计算机系统结构,MIPS64,模拟器演示实验3,存储器映射输出,文件名:,output.s,.,data,A:.word 10,B:.word 8,C:.word 0,CR:.word32 0 x10000,DR:.word32 0 x10008,.text,main:,ld r4,A(r0);r4(A),ld r5,B(r0);r5(B),dadd r3,r4,r5;r3r4+r5,sd r3,C(r0);Cr3,lwu r1,CR(r0);r1,指向,Control,寄存器,lwu r2,DR(r0);r2,指向,Data,寄存器,daddi r10,r0,1;,准备命令1(将,DATA,作为无符号整型数输出),sd r3,(r2);Data,寄存器,r3,sd r10,(r1);Control,寄存器1,halt,2014.2.17,37,计算机系统结构,MIPS64,模拟器演示实验4,存储器映射输入/输出,数据地址,0,x00000,程序存储器,程序起点,lwu r24,DATA(r0),lwu r25,CONTROL(r0),指令地址,0,x00000,数据存储器,常规数据区,0,x10000,0,x10008,sd r9,0(r24),sd r2,0(r25),控制寄存器,数据寄存器,仿真非智能终端,文件名:,testio.s,向虚拟终端输出字符串(命令4)、画线、画彩色点(命令5)。,CONTROL:.word32 0 x10000,DATA:.word32 0 x10008,.text,lwu$t8,DATA($zero);$t8=address of DATA register,lwu$t9,CONTROL($zero);$t9=address of CONTROL register,daddi$v0,$zero,1;set for unsigned integer output,ld$t1,int($zero),sd$t1,0($t8);write integer to DATA register,sd$v0,0($t9);write to CONTROL register and make it happen,daddi$v0,$zero,2;set for signed integer output,ld$t1,int($zero),sd$t1,0($t8);write integer to DATA register,sd$v0,0($t9);write to CONTROL register and make it happen,2014.2.17,38,计算机系统结构,习题2.14(补充,,MIPS64,指令系统练习),人工模拟以下,MIPS,程序的单条指令运行方式,在表中用16进制编码记录每一步产生的结果(不得借助模拟软件)。,.,data,n:.word 3,x:.double 0.5,.text,LD R1,n(R0),L.D F0,x(R0),DADDI R2,R0,1 ;R2 1,MTC1 R2,F11 ;F11 1,CVT.D.L F2,F11 ;F2 1,loop:MUL.D F2,F2,F0;F2 F2*F0,DADDI R1,R1,-1;decrement R1 by 1,BNEZ R1,loop ;if R10 continue,HALT ;,此条不填表,提示:,MIPS,浮点数的格式是,IEEE754,2014.2.17,39,计算机系统结构,习题2.14(补充)续,2014.2.17,40,计算机系统结构,实验1:,WinMIPS64,模拟器练习,实验要求:用,MIPS64,指令编写一个尽可能短小的程序,将事先存放在数据区的4字节字符串(例如“3901”)转换为一个4位,BCD,整数,赋给,R9。,在,WinMIPS64,模拟器调试通过。,实验报告:,(1)程序清单;,(2)运行结果(每轮循环末尾,R9,的数值,高位的0可以不写),(3)程序效率,2014.2.17,41,计算机系统结构,IEEE 754,浮点数标准(补充),目前国际上流行的浮点数标准是,IEEE 754,,其基本组成是32,bit,单精度、64,bit,双精度两种类型。,IEEE 754,标准的主要起草者是加州大学伯克利分校数学系教授,William Kahan,,他帮助,Intel,公司设计了8087浮点处理器(,FPU),,并以此为基础形成了,IEEE 754,标准,,Kahan,教授也因此获得了1987年的图灵奖。目前几乎所有包含浮点运算的处理机都宣称支持,IEEE 754,标准,包括,Intel,公司的,Pentium、,中国的“龙芯”。,IEEE 754,的标准文件是,ANSI/IEEE Std 754-1985IEEE Standard for Binary Floating-Point Arithmetic,,通过,Google,可搜到,pdf,文件下载。,Kahan,教授的主页:,www.cs.berkeley.edu/wkahan/。,2014.2.17,42,计算机系统结构,在,IEEE 754,浮点数国际标准中,32位单精度浮点数和64位双精度浮点数的格式分别如下:,对于单精度浮点数,阶码用移-127码表示,即阶码的0,255,分别表示阶码的真值为-127128。尾数(原码)用1位符号位、23位小数和1位隐藏的整数共25位表示。尾数的基值和阶码的基值都是2。,当,0e255,时,表示一个非零的规格化浮点数,数值为:,N,=(-1),s,2,e-127,(1.m),IEEE 754,浮点数标准(续1),2014.2.17,43,计算机系统结构,IEEE 754,浮点数标准(续2),当,e=255,,且,m,0,时,表示一个非数,NaN(Not-a-Number)。NaN,可能是在许多非确定的情况下,如零除以零、求负数的平方根等产生的结果。,当,e=255,,且,m=0,时,表示一个无穷数:,N=,(-1),s,。注意+和-的表示是不同的。,当,e=0,,且,m,0,时,表示规格化浮点数:,N=(-1),s,2,-126,(0.m)。,当,e=0,,且,m=0,时,表示浮点数零:,N=(-1),s,0,。注意+0与-0的表示是不同的。,对于64位双精度浮点数,阶码用移-1023码表示,其他规定与单精度浮点数类似。,2014.2.17,44,计算机系统结构,各次作业应交的内容,作业2(第2次课),2.14(补充),实验1,2014.2.17,45,计算机系统结构,
展开阅读全文