第4章 中央处理器设计(RISC)
- 格式:pps
- 大小:1.67 MB
- 文档页数:248
第4章中央处理器设计(RISC) 中央处理器也简称为处理器(或称为CPU)是组成计算机系统的核心部件,是计算机组成原理研究的主要内容之一。
4.1 计算机组成的层次概念⏹软件⏹应用软件⏹系统软件⏹编译⏹指令系统⏹硬件⏹数据路径⏹数字电路⏹物理实现计算机系统的层次结构见图4.14.2 RISC与CISC⏹4.2.2 精简指令系统计算机体系结构⏹精简指令系统的依据⏹通过优化典型的高级语言程序中最耗费时间的操作,能够更好地支持高级语言。
RISC结构通常体现如下几点:⏹首先是使用大量的寄存器;⏹其次,要精心设计流水线;⏹最后,应采用相对简单的指令系统。
这对于在单一芯片上实现CPU是有益的。
4.2.2 精简指令系统计算机体系结构⏹精简指令系统的特征⏹指令系统简单;⏹只有load和store指令可以访问存储器;⏹简单的寻址方式;⏹固定长度的指令格式。
假设模型机中有32个寄存器。
所有的算术逻辑运算都使用寄存器操作数;采用load/store结构,即只有load和store指令可以访问存储器4.3 模型机的指令系统⏹模型机指令系统的设计原则是:⏹采用简单的指令系统⏹规模适度⏹认真权衡利弊⏹加快经常性事件的运行速度4.3.1把模型机的汇编语句翻译成机器指令⏹模型机的加法指令:⏹add T0,S1,S2⏹用十进制表示是017188032⏹寄存器S0到S7相对应的是寄存器16到23,寄存器T0到T7相对应的是寄存器8到15。
4.3.2 模型机的指令格式⏹模型机指令中每一个字段名称的含义如下:⏹Op :指令的基本操作,称为操作码⏹rs :第一个源操作数寄存器⏹rt :第二个源操作数寄存器⏹rd :目标操作数寄存器,它存放的是指令操作的结果⏹shamt :暂时不用。
⏹funct :这个字段选择Op 字段中的具体操作,有时被称为function 字段或功能字段。
6位5位5位5位5位6位Oprs rt rd shamt funct4.3.3 模型机寻址方式⏹寄存器寻址方式⏹首先约定如下的符号:用Rs 、Rt 、Rd 分别表示rs 、rt 、rd 字段(见图4.2)描述的寄存器中存储的数据。
⏹算术运算(如add )指令采用的是寄存器寻址方式,它的三个操作数都在寄存器中。
⏹设有以下算术运算指令:add T0,R1,R2。
其含义是将寄存器R1和R2中的值求和,并将其结果存放于寄存器T0中。
R1、R2、T0分别对应于指令格式中的rs 、rt 、rd 字段所表示的寄存器(见图4.2)中存储的数据,即Rs 、Rt 、Rd 。
此时Rd=Rs+Rt 。
寄存器寻址方式对应的指令格式称为R 格式(R 类型)。
4.3.3 模型机寻址方式⏹基址寻址方式⏹基址寻址方式的有效地址按下式计算:EA=Rs+address(4.1)⏹其中address是指令格式中的低16位字段(图4.2)的数值。
⏹基址寻址方式对应的指令格式称为I格式(I类型)。
⏹数据传送指令使用I格式。
4.3.3 模型机寻址方式⏹load指令采用基址寻址方式(I格式,图4.2)⏹把数据从存储器中读到寄存器中的情况称为读(load)。
load指令的功能如下:⏹Rt←M(Rs+address)或记为Rt=M(Rs+address)⏹load指令的用法举例:⏹例如:指令load T0, 32(S3)将基址寄存器S3(位于指令的rs字段)的内容加上32(位于指令的address字段),其求和后的结果作为存储器的地址,用该地址访问存储器,将其内容读出,再写入到寄存器T0中,T0由指令的rt字段标识。
4.3.3 模型机寻址方式⏹store指令采用基址寻址方式(I格式,图4.2)⏹store指令的功能是将寄存器rt中的数据传送(写)到存储器当中去,存储器的地址也由(4.1)式计算。
store指令的功能如下:⏹M(Rs+address)←Rt或记为M(Rs+address)=Rt⏹store指令的用法举例:⏹例如:指令store T0, 32(S3)将寄存器T0(T0由指令的rt字段标识)中的内容写入到存储器中去,存储器的地址为基址寄存器S3(位于指令的rs字段)的内容加上32(位于指令的address字段)。
4.3.3 模型机寻址方式⏹立即寻址方式(图4.2)⏹加法指令中,如果有一个操作数为常数,则称为立即数加法指令,记为addi。
寄存器SP加常数4就可以写成:⏹addi SP,SP,4 //SP=SP+44.3.3 模型机寻址方式⏹在RISC中,通常提供一个特殊的寄存器,称为ZERO寄存器,寄存器ZERO中的值始终为零。
⏹为了和其他值比较,就必须有一个立即数形式的小于比较指令。
如比较S2是否小于10,其判断条件可写成:⏹slti T0,S2,10 // 如果S2<10,则T0=1⏹后面紧接着的指令可以通过判断T0是否等于1来确定S2是否小于10。
4.3.3 模型机寻址方式⏹32位常数的处理⏹lui指令:它用来设置寄存器中某常数的高16位,并允许下一条指令指定此常数的低16位。
⏹例如:lui T0,255 // T0为寄存器8⏹指令lui T0,255的功能是将指令中的16位立即数255传入寄存器T0的高16位,再将T0的低16位置零。
4.3.3 模型机寻址方式⏹lui 指令应用举例⏹将如下的一个32位常数装入寄存器S0?⏹0000 0000 0011 1101 0000 1001 0000 0000⏹lui S0,61 //(61)10=(0000 0000 0011 1101)2⏹运行后S0的内容为:⏹0000 0000 0011 11010000 0000 0000 0000⏹下一步加上低16位,转化为十进制数为2304:⏹addi S0,S0,2304 //(2304)10=(0000 1001 0000 0000)2⏹S0的最终值即为所求的结果:⏹0000 0000 0011 1101 0000 1001 0000 0000首先使用lui 指令装入高16位数据,然后使用立即数加法指令装入低16位数据4.3.3 模型机寻址方式⏹PC相对寻址方式(图4.2)⏹bne S0,S1,Exit //如果S0≠S1,转向标号为Exit的指令。
⏹如果程序的转移地址须装入指令的低16位字段,则意味着所有程序的代码长度都不能超过216个指令字,这在现实中是远远不够的。
⏹一种解决方法是指定一个寄存器,将它的值与转移地址相加,这样转移指令的地址计算如下:PC=某寄存器中的值+转移地址(4.3)⏹由于模型机的寄存器是32位,这个和允许程序达到232,解决了转移地址大小的问题。
4.3.3 模型机寻址方式PC=某寄存器中的值+转移地址(4.3)⏹(4.3)式右边的“某寄存器”应使用哪个寄存器?⏹条件转移指令要根据当前指令的运行结果来判断下一条指令的地址,因此它们倾向转向附近的指令。
⏹当把指令格式中的低16位看成是补码时有:-215≤转移地址≤215-1。
⏹于是条件转移的范围是以当前的PC值为中心,上、下的偏移范围大约是215。
由于几乎所有的循环和条件转移的范围都小于215个指令字,所以(4.3)式的右边选择寄存器PC是理想的。
⏹注意模型机PC中的当前(地址)值是相对于下一条指令(PC+4)的地址而不是当前指令的地址。
4.3.3 模型机寻址方式⏹伪直接寻址方式(图4.2)⏹在条件转移指令中使用PC相对寻址。
⏹对无条件转移指令和转移连接指令使用J格式为程序调用提供比较长的转移地址。
⏹例如:jump10000 // 转向指令100004.4 汇编语言概念⏹翻译器(translator):翻译器是这样一种程序,它可以把用某种语言编写的用户程序转换成另一种语言的程序。
⏹源语言(source language):翻译器转换之前的程序使用的语言称为源语言。
⏹目标语言(target language):翻译器转换之后的语言称为目标语言。
4.4 汇编语言概念⏹汇编语言与汇编器(assembler):如果源语言基本上是数字型机器语言的符号表示,则源语言称为汇编语言,相应地就把这种源语言的翻译器称为汇编器。
⏹编译器(complier):如果源语言是C语言(或Java语言等)这样的高级语言,而目标语言或者是数字型机器语言或者是机器语言的符号表示(即汇编语言),那么这种翻译器就称为编译器。
4.4 汇编语言概念⏹在纯粹的汇编语言中,每条语句都精确地产生一条机器指令。
⏹汇编语言程序员可以访问目标计算机的所有指令,可以利用目标计算机的所有特性,而高级语言程序员就没有这样的能力。
⏹汇编语言和高级语言的另一个重要的区别是:汇编语言程序只能运行在指令系统相同的系列计算机上,而高级语言程序则可以运行在各种不同的计算机上。
⏹汇编语言编写程序不方便,强迫程序员用机器的方式思考问题。
4.5 指令系统—软件的接口在这一节里,将考虑将高级语言—C语言的源程序转换成模型机的汇编语言程序,看看模型机的汇编语言程序究竟要完成哪些基本的操作,这将有助于加深理解中央处理器的硬件设计部分。
4.5.1 C语言赋值语句编译为模型机的汇编语言程序⏹赋值语句的编译⏹用寄存器编译C的赋值语句⏹例如:f=(g+h)-(i+j);⏹设编译器将变量f、g、h、i、j分别放在寄存器S0、S1、S2、S3、S4中。
那么经过编译后的模型机汇编语言代码如下:⏹add T0,S1,S2 //寄存器T0中存放g+h⏹add T1,S3,S4 //寄存器T1中存放i+j⏹sub S0,T0,T1 // f等于T0减T1,也就是(g+h)-(i+j)R型指令应是模型机的处理器硬件能够运行的基本指令之4.5.1 C语言赋值语句编译为模型机的汇编语言程序⏹当一个操作数在存储器中时编译一个赋值语句⏹现在编译下面的C赋值语句:g=h+A[8];⏹假设A是一个数组,并且在这之前编译器已经将变量g和h 存放在寄存器S1和S2中,又假设数组的首地址(或称为基地址)在寄存器S3中,则结果是:⏹load T0,32(S3) //寄存器T0中的值是A[8]⏹add S1,S2,T0 //g=h+A[8]为了实现高级语言(C语言)的数组的运算,load指令应是模4.5.1 C语言赋值语句编译为模型机的汇编语言程序⏹用load和store指令进行编译(目标操作数存放在存储器中)⏹假设变量h存放在寄存器S2中,并且数组A的基地址存放在寄存器S3中。
假设C语句为:⏹A[12]=h+A[8];⏹对应的模型机汇编代码是:⏹load T0,32(S3) //中间寄存器T0中存放A[8]的值⏹add T0,S2,T0 //中间寄存器T0中存放h+A[8]的值⏹store T0,48(S3) //把h+A[8]的值存放在A[12]中为了实现高级语言(C语言)的数组的运算,store指令应是模4.5.1 C语言赋值语句编译为模型机的汇编语言程序⏹用数组下标变量索引进行编译⏹这里考虑的是一个具有下标变量的数组:g=h+A[i];⏹假设A数组的基地址在寄存器S3中,编译器把变量g、h、i分别存放在S1、S2、S4中。