目录
- 指令集结构的分类
- 寻址方式
- 指令集结构的功能设计
3.1 CISC指令集结构的功能设计
3.2 RISC指令集结构的功能设计- 操作数的类型大小
- 指令格式的设计
- MIPS指令集结构
6.1 MIPS的寄存器
6.2 MIPS的数据表示
6.3 MIPS的数据寻址方式
6.4 MIPS的指令格式
6.5 MIPS的操作
6.6 MIPS的控制指令
6.7 MIPS的浮点操作
⚠️RISC执行程序比CISC快的主要原因:RISC指令平均执行周期数少
1. 指令集结构的分类
- 区别不同指令集结构的主要因素:CPU中用来存储操作数的存储单元的类型【堆栈、累加器和通用寄存器组】
- 对于不同类型的指令集结构,其操作数位置、个数以及操作数的给出方式、显示(或隐式)也不同【显式:用指令字中的操作数字段给出;隐式:使用事先约好的单元(eg:比如默认加到AX寄存器上)】
- 4中指令集结构中的操作数的位置及结果去向:
堆栈结构:操作数取自栈顶,结果回堆栈;不访问内存,访问CPU内部堆栈 - 表达式C=A+B在4种类型指令集结构上的代码:
- 通用寄存器结构在灵活性和提高性能方面有明显的优势:
- 与其他CPU内部存储单元一样,寄存器的访问速度比存储器快
- 对编译器而言,能更加容易、有效地分配和使用寄存器
- 寄存器可以用来存放变量【减少对存储器的访问加快程序执行速度;用更少的地址位来对寄存器进行寻址,有效地减少目标代码】
- 存储单元类型->操作数的来源->ALU指令的操作数个数->ALU指令中存储器操作数的个数【0-3:0表示没有】:
- 有3个操作数:2个源操作数、1个目的操作数‘
- 有2个操作数:1个既作为源操作数,又作为目的操作数
2. 寻址方式
- 寻址方式:一种指令集结构如何确定所要访问的数据的地址(定义的是以何种方式找到操作数)
指令格式:指令以何种方式组织操作码和操作数 - 对于存储器操作数来说,由寻址方式确定的实际存储器地址称为有效地址
注:
-
代表李技术
- ()代表的是寄存器中存储的地址在MEM下的映射
- d代表操作数大小,即存储一个单元格的数据的长度 1个字节:1,4个 字节:2,32个字节:4【在自增/自减寻址方式和缩放寻址方式中,用变量D来指明被访问的数据项的大小。只有当所要访问的数据元素在存储器中是相邻存放时,这3种寻址方式才有意义】
- PC相对寻址:一种以程序计数器PC作为参考点的寻址方式,主要用于在转移指令中指定目标指令的地址。
- 相关结论:
- 程序所使用的偏移量大小分布广泛,主要是因为在存储器中所保存的数据并不是十分集中,需要使用不同的偏移量才能对其进行访问
- 较小和较大的偏移量均占有相当大的比例
- 立即数寻址方式主要用于ALU指令、比较指令和用于给寄存器装入常数等
- 最常使用的是较小的立即数,然而有时也会用到较大的立即数(主要是用于地址计算)
- 在指令集结构设计中,至少将立即数的大小设置为8-16位
3. 指令集结构的功能设计
由于指令集结构是系统结构的主要内容之一,所以它的功能设计实际上就是确定软硬件功能分配,即确定那些基本功能应该由硬件实现,哪些功能由软件实现比较合适。
确定哪些基本功能由硬件来实现时,主要考虑的因素有3个:速度、成本与灵活性。选择出现频度高的基本功能用硬件实现
对指令集的基本要求:
比较内容 | CISC | RISC |
---|---|---|
设计目标 | 1. 强化指令功能 2.减少程序指令条数,以达到提高性能的目的 | 尽可能简化指令集,不仅指令条数少而且指令功能比较简单 |
增强功能着手点 | 1.面向目标程序增强指令功能 2.面向高级语言的优化增强指令功能 3.面向操作系统的优化增强指令功能 | no |
3.1 CISC指令集结构的功能设计
1.面向目标程序增强指令功能
- 增强运算型指令的功能
- 增强数据传送指令功能
- 增强程序控制指令的功能
循环控制指令可以有两种实现方式:通常用3条指令来完成——一条加法指令、一条比较指令和一条分支指令
2. 面向高级语言的优化实现来改进指令集
高级语言程序的编译问题:
编译器本身比较复杂
编译器生成的目标代码比较难以很好的优化
- 增强对高级语言和编译器的支持
- 高级语言计算机
间接执行高级语言计算机:需要使用汇编的方法把高级语言源程序翻译成机器语言程序
直接执行高级语言计算机:直接由硬件对高级语言源程序逐条进行解释执行,既不用编译也不用汇编
3. 面向操作系统的优化改进指令集
操作系统的实现在很大程度上取决于系统结构的支持
指令集对操作系统的支持主要有:
- 处理机工作状态和访问方式的切换
- 进程的管理和切换
- 存储管理和信息保护
- 进程的同步与互斥,信号灯的管理等
3.2 RISC指令集结构的功能设计
- CISC指令结构存在的问题
- 各种指令的使用频度相差悬殊
- 指令集庞大,指令条数很多,许多指令的功能又很复杂
- 许多指令由于操作繁杂,其CPI值比较大
- 由于指令功能复杂,规整性不好,不利于流水提高性能
- RISC计算机应该遵循的规则:
- 指令条数少而简单
- 采用简单而又统一的指令格式,并减少寻址方式(字长32/64)
- 指令的执行在单个机器周期内完成(采用流水线机制后)
- 只有load和store指令才能访问存储器(其他指令的操作都是在寄存器之间进行,采用load-store结构
- 大多数指令都采用硬连逻辑来实现
- 强调优化编译器的作用,为高级语言程序生成优化的代码
- 充分采用流水线技术来提高性能
3.3 控制指令
控制指令是用来改变控制流的,当指令是无条件改变控制流时——跳转指令;有条件——分支指令。能够改变控制流的指令有4种:条件分支、跳转、过程调用、过程返回
- 在控制指令中必须给出转移的目标地址。在绝大多数情况下,指令中都会显式给出目标地址,但是过程返回指令是个例外,因为在编译的时候不知道其返回地址。
- 指定转移目标地址最常用的方法是==在指令中提供一个偏移量,由该偏移量和PC的值相加得出目标地址【PC相对寻址】
- 优点:1. 有效减少表示该目标地址所需要的位数;2. 位置无关(减少程序连接的工作量)
- 关键:确定偏移量字段的长度(采用4~8位即可)
- 对于过程返回和过程调用,除改变控制流之外,可能还要保存机器状态(至少也要保存返回地址)过去有些指令集结构提供了专门的保存机制来保存许多寄存器的内容,现在新的机制要求编译器来生成load和store指令来保存或恢复寄存器的内容
4. 操作数的类型和大小
数据表示:计算机硬件能直接识别、指令集可直接调用的数据类型
数据结构:由软件进行处理和实现的各种数据类型,一般除了数据表示之外所有的数据类型都是数据结构要研究的内容
确定数据表示实际上也是个软硬件取舍折中的问题
5. 指令格式的设计
- 指令一般包括两部分:操作码和地址码。指令格式的设计就是确定指令字的编码方式。包括操作码字段和地址码字段的编码和表示方式。
- 寻址方式的表示方法有两种:1. 把它和操作码一起编码 2. 设置专门的地址描述符
- 计算机中寄存器的个数和寻址方式的数目对计算机的指令字长由很大影响;所设计的指令格式便于硬件处理,特别是流水实现;至少指令字长应该是字节的整数倍,而不能是随意的倍数
6.MIPS指令集结构
6.1 MIPS的寄存器
6.2 MIPS的数据表示
- 设置半字和32位的原因都是在类似于C的高级语言中有这种数据类型,而且在操作系统等程序中也很常用,这些程序很重视数据所占的空间大小。
- MIPS的操作都是针对64位整数和32、64位浮点数进行的,其余的在装入的时候使用零扩展或符号扩展来填充该寄存器的剩余部分。装入后按照64位整数的方式运算。
6.3 MIPS的数据寻址方式
- MIPS的存储器是按字节寻址的,地址为64位。GPR和FPR与存储器之间的数据传送是通过load和store指令实现的。
- 所有存储器访问都必须是边界对齐的
6.4 MIPS的指令格式
- MIPS的寻址方式是编码到操作码中的,所有指令都是32位的,操作码占6位,按照不同类型的指令设置的不同格式,共有3种格式:
- I类指令(立即数)
包括所有的load\store指令、立即数指令、分支指令、寄存器跳转指令、寄存器链接跳转指令;立即数字段16位,用于提供立即数或偏移量
- R类指令(寄存器)
包括ALU指令、专用寄存器读写指令、move指令等
- J类指令(跳转)
包括跳转指令、跳转并连接指令、自陷指令与异常返回指令;低26位是偏移量,与PC相加形成跳转地址
6.5 MIPS的操作
MIPS的指令可以分为4类:load和store、ALU操作、分支与跳转和浮点操作
除了R0之外,所有通用寄存器与浮点寄存器都可以进行load或store。
MIPS中所有的ALU指令都是寄存器-寄存器型指令或立即数型
6.6 MIPS的控制指令
在MIPS中,控制流的改变是由一组分支指令实现的。
- 跳转指令:
- 根据跳转指令确定目标地址的方式不同以及跳转时是否链接,可以把跳转指令分成4类(2*2)
- 确定目标地址的方式有2种:把26位偏移量左移2位,替换程序计数器的低28位(简单跳转);另一种是由指令中指定的一个寄存器来给出跳转目标地址(间接跳转)
- 简单跳转只需要将目标地址送入程序计数器;跳转并连接多一个操作:把返回地址(顺序下一条指令的地址)放入寄存器R3.
- 分支指令:
- 所有的分支指令都是条件转移
- 分支条件由指令确定;提供了一组比较指令,用于比较两个寄存器的值(Reg和Reg/Reg+Immediate)
- 有的分支指令可以直接判断寄存器内容是否为负,或者比较两个寄存器是否相等
- 分枝的目标地址由16位带符号偏移量左移2位后和PC相加结果来决定
- 还有一条浮点条件分支指令,该指令通过测试浮点状态寄存器来决定是否进行分支
6.7 MIPS的浮点操作
- 由操作码给出浮点精度:S—单精度;D——双精度
- 浮点操作
包括加减乘除,分别有单、双精度指令 - 浮点数比较指令
根据比较结果设置浮点状态寄存器中的某一位,一边后面的分支BC1T(若真则分支)或BC1F(若假则分支)测试该位。