第1页:计算机指令集结构封面
计算机指令集结构封面
计算机指令集结构
第2页:计算机指令集结构目录
计算机指令集结构目录
- 2.1 指令集结构的分类
- 2.2 寻址方式
- 2.3 指令集结构的功能设计
- 2.4 操作数的类型和大小
- 2.5 指令格式的设计
- 2.6 MIPS指令集结构
第3页:区别不同指令集结构的主要因素CPU中用来
区别不同指令集结构的主要因素CPU中用来
- 区别不同指令集结构的主要因素CPU中用来存储操作数的存储单元的类型2.CPU中用来存储操作数的存储单元的主要类型
- 堆栈
- 累加器
- 通用寄存器组3.将指令集结构分为三种类型
第4页:指令集结构的分类:堆栈结构
指令集结构的分类:堆栈结构
- 堆栈结构
- 累加器结构
- 通用寄存器结构根据操作数的来源不同,又可进一步分为:
- 寄存器-存储器结构(RM结构)(操作数可以来自存储器)
- 寄存器-寄存器结构(RR结构)(所有操作数都是来自通用寄存器组)也称为load-store结构,这个名称强调:只有load指令和store指令能够访问存储器。
第5页:对于不同类型的指令集结构
对于不同类型的指令集结构
- 显式给出
- 用指令字中的操作数字段给出
- 隐式给出
- 使用事先约定好的存储单元5.4种指令集结构的操作数的位置以及结果的去向
- 对于不同类型的指令集结构,操作数的位置、个数以及操作数的给出方式(显式或隐式)也会不同。
第6页:指令集结构的分类:灰色块
指令集结构的分类:灰色块
- 灰色块
- 操作数黑色块:结果TOS(Top Of Stack):栈顶
第7页:例:表达式C=A+B在4种类型指令集结构
例:表达式C=A+B在4种类型指令集结构
- 例:表达式C=A+B在4种类型指令集结构上的代码。假设:A、B、C均保存在存储器单元中,并且不能破坏A和B的值。寄存器(RR型)寄存器(RM型)累加器堆栈load R1,Aload R1,Aload Apush Aload R2,Badd R1,Badd Bpush Badd R3,R1,R2store R1,Cstore Caddstore R3,Cpop C
第8页:通用寄存器结构
通用寄存器结构
- 通用寄存器结构
- 现代指令集结构的主流
- 在灵活性和提高性能方面有明显的优势
- 跟其他的CPU内部存储单元一样,寄存器的访问速度比存储器快。
- 对编译器而言,能更加容易、有效地分配和使用寄存器。
- 寄存器可以用来存放变量。(1)减少对存储器的访问,加快程序的执行速度;(因为寄存器比存储器快)
第9页:2)用更少的地址位(相对于存储器地址来说
2)用更少的地址位(相对于存储器地址来说
- 2)用更少的地址位(相对于存储器地址来说)来对寄存器进行寻址,从而有效地减少程序的目标代码的大小。7.根据ALU指令的操作数的两个特征对通用寄存器型指令集结构进一步细分
- ALU指令的操作数个数
- 3个操作数的指令两个源操作数、一个目的操作数
- 2个操作数的指令其中一个操作数既作为源操作数,又作为目的操作数。
第10页:ALU指令中存储器操作数的个数可以是0~
ALU指令中存储器操作数的个数可以是0~
- ALU指令中存储器操作数的个数可以是0~3中的某一个,为0表示没有存储器操作数。
第11页:指令集结构的分类数据表
指令集结构的分类数据表
本页含数据表/图示,源文件文字与数字粘连,未能安全切分为表格,以下为原文提取文字,具体数值请对照原课件图片核对。
机器实例结构类型ALU指令中操作数的最多个数ALU指令中存储器操作数的个数MIPS,SPARC,Alpha,PowerPC,ARMRR30IBM 360/370,Intel80x86,Motorola 68000RM21IBM 360/370RM3VAXMM22VAXMM338.ALU指令中操作数个数和存储器操作数个数的典型组合
第12页:通用寄存器型指令集结构进一步细分为3种类
通用寄存器型指令集结构进一步细分为3种类
- 通用寄存器型指令集结构进一步细分为3种类型
- 寄存器-寄存器型(RR型)
- 寄存器-存储器型(RM型)
- 存储器-存储器型(MM型)10.3种通用寄存器型指令集结构的优缺点表中(m,n)表示指令的n个操作数中有m个存储器操作数。
第13页:缺点优点指令集结构类型与指令中含存储器操
缺点优点指令集结构类型与指令中含存储器操
- 缺点优点指令集结构类型与指令中含存储器操作数的指令集结构相比,指令条数多,目标代码不够紧凑,因而程序占用的空间比较大指令字长固定,指令结构简洁,是一种简单的代码生成模型,各种指令的执行时钟周期数相近寄存器-寄存器型(0,3)指令中的两个操作数不对称。在一条指令中同时对寄存器操作数和存储器操作数进行编码,有可能限制指令所能够表示的寄存器个数。指令的执行时钟周期数因操作数的来源(寄存器或存储器)不同而差别比较大可以在ALU指令中直接对存储器操作数进行引用,而不必先用load指令进行加载。容易对指令进行编码,目标代码比较紧凑寄存器-存储器型(1,2)指令字长变化很大,特别是3操作数指令。而且每条指令完成的工作也差别很大。对存储器的频繁访问会使存储器成为瓶颈。这种类型的指令集结构现在已不用了目标代码最紧凑,不需要设置寄存器来保存变量存储器-存储器型(2,2)或(3,3)
第14页:一种指令集结构如何确定所要访问的数据的地
一种指令集结构如何确定所要访问的数据的地
- 赋值操作
- Mem
- 存储器
- Regs
- 寄存器组
- 方括号
- 表示内容
- 一种指令集结构如何确定所要访问的数据的地址?2.当前的指令集结构中所采用的一些操作数寻址方式
第15页:寻址方式数据表
寻址方式数据表
本页含数据表/图示,源文件文字与数字粘连,未能安全切分为表格,以下为原文提取文字,具体数值请对照原课件图片核对。
寻址方式指令实例含义寄存器寻址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]
第16页:少程序的指令条数,但可能增加计算机的实现
少程序的指令条数,但可能增加计算机的实现
- 少程序的指令条数,但可能增加计算机的实现复杂度以及指令的CPI。
第17页:的使用频度最高。3.各种寻址方式的使用情
的使用频度最高。3.各种寻址方式的使用情
- 的使用频度最高。3.各种寻址方式的使用情况统计结果在VAX机器上运行gcc、Spice和Tex基准程序
第18页:偏移量的取值范围在load-store结
偏移量的取值范围在load-store结
- 偏移量的取值范围在load-store结构的机器(Alpha)上运行SPEC CPU2000基准程序
第19页:寻址方式
寻址方式
- 程序所使用的偏移量大小分布十分广泛主要是因为在存储器中所保存的数据并不是十分集中,需要使用不同的偏移量才能对其进行访问。
- 较小的偏移量和较大的偏移量均占有相当大的比例
第20页:立即数寻址方式
立即数寻址方式
- 立即数寻址方式
- 立即数寻址方式的使用频度使用频度指令类型浮点平均整型平均22%23%load指令19%25%ALU指令16%21%所有指令大约1/4的load指令和ALU指令采用了立即数寻址。
第21页:立即数的取值范围
立即数的取值范围
第22页:最常用的是较小的立即数
最常用的是较小的立即数
- 最常用的是较小的立即数;
- 有时也会用到较大的立即数(主要是用于地址计算)。
- 在指令集结构设计中,至少要将立即数的大小设置为8~16位。
- 在VAX机(支持32位立即数)上做过类似的统计,结果表明20%~25%的立即数超过16位。
第23页:指令集结构的功能设计
指令集结构的功能设计
- 指令集结构的功能设计
- 确定软、硬件功能分配,即确定哪些基本功能应该由硬件实现,哪些功能由软件实现比较合适。2.在确定哪些基本功能用硬件来实现时,主要考虑3个因素:速度、成本、灵活性
- 硬件实现的特点速度快、成本高、灵活性差
- 软件实现的特点速度慢、价格便宜、灵活性好
第24页:对指令集的基本要求完整性、规整性
对指令集的基本要求完整性、规整性
- 完整性
- 在一个有限可用的存储空间内,对于任何可解的问题,编制计算程序时,指令集所提供的指令足够用。
- 对指令集的基本要求完整性、规整性、高效率、兼容性
- 前4类属于通用计算机系统的基本指令
- 对于最后4种类型的操作,不同指令集结构的支持大不相同。
第25页:运算和逻辑操作
运算和逻辑操作
- 运算和逻辑操作
- 加,减,乘,除,与,或等算术和逻辑运算load,store数据传输分支,跳转,过程调用和返回,自陷等控制操作系统调用,虚拟存储器管理等系统浮点操作:加,减,乘,除,比较等浮点十进制加,十进制乘,十进制到字符的转换等十进制字符串移动,字符串比较,字符串搜索等字符串像素操作,压缩/解压操作等图形
第26页:指令集结构的功能设计:规整性
指令集结构的功能设计:规整性
- 规整性
- 主要包括对称性和均匀性。
第27页:指令集结构的功能设计:高效率
指令集结构的功能设计:高效率
- 高效率
- 指指令的执行速度快、使用频度高。4.在设计指令集结构时,有两种截然不同的设计策略。(产生了两类不同的计算机系统)
- CISC(复杂指令集计算机)
- 增强指令功能,把越来越多的功能交由硬件来实现,并且指令的数量也是越来越多。
- RISC(精简指令集计算机)
- 尽可能地把指令集简化,不仅指令的条数少,而且指令的功能也比较简单。
第28页:CISC结构追求的目标强化指令功能
CISC结构追求的目标强化指令功能
- CISC结构追求的目标强化指令功能,减少程序的指令条数,以达到提高性能的目的。2.增强指令功能主要是从以下几个方面着手
- 面向目标程序增强指令功能
- 增强运算型指令的功能
- 增强数据传送指令的功能
- 增强程序控制指令的功能丰富的程序控制指令为编程提供了多种选择。计
第29页:循环在程序中占有相当大的比例
循环在程序中占有相当大的比例
- 循环在程序中占有相当大的比例,所以在指令上提供专门的支持。
- 循环控制部分通常用3条指令完成
- 设置循环控制指令,用一条指令完成上述3条指令的功能。一般循环程序的结构
第30页:面向高级语言的优化实现来改进指令集
面向高级语言的优化实现来改进指令集
- 面向高级语言的优化实现来改进指令集(缩小高级语言与机器语言的语义差距)高级语言与一般的机器语言的语义差距非常大,为高级语言程序的编译带来了一些问题。
- 编译器本身比较复杂。
- 编译生成的目标代码比较难以达到很好的优化。
第31页:指令集结构的功能设计
指令集结构的功能设计
第32页:增强对高级语言和编译器的支持
增强对高级语言和编译器的支持
- 增强对高级语言和编译器的支持
- 对源程序中各种高级语言语句的使用频度进行统计与分析,对使用频度高、执行时间长的语句,增强有关指令的功能,加快这些指令的执行速度,或者增加专门的指令,可以达到减少目标程序的执行时间和减少目标程序长度的目的。
- 增强系统结构的规整性,减少系统结构中的各种例外情况。(面向高级语言的计算机)
第33页:高级语言计算机①间接执行高级语言机器高级
高级语言计算机①间接执行高级语言机器高级
- 高级语言计算机①间接执行高级语言机器高级语言成为机器的汇编语言,这时高级语言和机器语言是一一对应的。用汇编的方法把高级语言源程序翻译成机器语言程序。②直接执行高级语言的机器直接把高级语言作为机器语言,直接由固件/硬件对高级语言源程序的语句逐条进行解释执行。这时既不用编译,也不用汇编。
第34页:面向操作系统的优化实现改进指令集
面向操作系统的优化实现改进指令集
- 面向操作系统的优化实现改进指令集
- 操作系统和计算机系统结构是紧密联系的,操作系统的实现在很大程度上取决于系统结构的支持。
- 指令集对操作系统的支持主要有
- 处理机工作状态和访问方式的切换。
- 进程的管理和切换。
- 存储管理和信息保护。
- 进程的同步与互斥,信号灯的管理等。支持操作系统的有些指令属于特权指令,一般用户程序是不能使用的。
第35页:CISC指令集结构存在的问题
CISC指令集结构存在的问题
- CISC指令集结构存在的问题(1979年开始,Patterson等人的研究)
- 各种指令的使用频度相差悬殊
- 据统计:只有20%的指令使用频度比较高,占运行时间的80%,而其余80%的指令只在20%的运行时间内才会用到。
- 使用频度高的指令也是最简单的指令。计
第36页:RISC指令集结构的功能设计数据表
RISC指令集结构的功能设计数据表
本页含数据表/图示,源文件文字与数字粘连,未能安全切分为表格,以下为原文提取文字,具体数值请对照原课件图片核对。
指令执行频度(占执行指令总数的百分比)80x86指令执行频度排序22%load120%条件分支216%比较312%store48%加56%与65%减74%寄存器-寄存器间数据移动81%调用子程序91%返回1095%合计Intel 80x86最常用的10条指令
第37页:指令集庞大,指令条数很多
指令集庞大,指令条数很多
- 指令集庞大,指令条数很多,许多指令的功能又很复杂,使得控制器硬件非常复杂。导致的问题
- 占用了大量的芯片面积(如占用CPU芯片总面积的一半以上),给VLSI设计造成很大的困难;
- 增加了研制时间和成本,容易造成设计错误。
- 许多指令由于操作繁杂,其CPI值比较大,执行速度慢。采用这些复杂指令有可能使整个程序的执行时间反而增加。
- 由于指令功能复杂,规整性不好,不利于采用流水技术来提高性能。
第38页:设计RISC机器遵循的原则
设计RISC机器遵循的原则
- 设计RISC机器遵循的原则
- 指令条数少而简单。只选取使用频度很高的指令,在此基础上补充一些最有用的指令。
- 采用简单而又统一的指令格式,并减少寻址方式;指令字长都为32位或64位。
- 指令的执行在单个机器周期内完成。(采用流水线机制)
- 只有load和store指令才能访问存储器,其他指令的操作都是在寄存器之间进行。(即采用load-store结构)
- 大多数指令都采用硬连逻辑来实现。
第39页:强调优化编译器的作用
强调优化编译器的作用
- 强调优化编译器的作用,为高级语言程序生成优化的代码。
- 充分利用流水技术来提高性能。3.早期的RISC微处理器
- 1981年,Berkeley分校的Patterson等人的32位微处理器RISC I
- 31条指令,指令字长都是32位,78个通用寄存器,时钟频率为8 MHz;
- 控制部分所占的芯片面积只有约6%。商品化微处理器MC68000和Z8000分别为50%和53%;
- 性能比MC68000和Z8000快3~4倍。
第40页:1983年的RISCⅡ
1983年的RISCⅡ
- 1983年的RISCⅡ
- 指令条数为39,通用寄存器个数为138,时钟频率为12 MHz。
- 后来发展成了Sun公司的SPARC系列微处理器。
- 1981年,Stanford大学Hennessy等人的MIPS后来发展成了MIPS Rxxx系列微处理器。
- IBM的801共同特点
- 采用load-store结构
- 指令字长为32位
- 采用高效的流水技术
第41页:控制指令是用来改变控制流的
控制指令是用来改变控制流的
- 跳转
- 当指令是无条件改变控制流时,称之为跳转指令。
- 分支
- 当控制指令是有条件改变控制流时,则称之为分支指令。2.能够改变控制流的指令
第42页:控制指令的使用频度
控制指令的使用频度
- 控制指令的使用频度(load-store型指令集结构的机器,基准程序为SPEC CPU2000)使用频度指令类型浮点平均整型平均8%19%调用/返回10%6%跳转82%75%分支改变控制流的大部分指令是分支指令(条件转移)。
第43页:常用的3种表示分支条件的方法及其优缺点缺
常用的3种表示分支条件的方法及其优缺点缺
- 常用的3种表示分支条件的方法及其优缺点缺点优点检测分支条件的方法名称条件码是增设的状态。而且它限制了指令的执行顺序,因为要保证条件码能顺利地传送给分支指令可以自由设置分支条件检测由ALU操作设置的一些特殊的位(即CC)条件码(CC)占用了一个寄存器简单比较指令把比较结果放入任何一个寄存器,检测时就检测该寄存器条件寄存器当采用流水方式时,该指令的操作可能太多,在一拍内做不完用一条指令(而不是两条)就能实现分支比较操作是分支指令的一部分,通常这种比较是受到一定限制的比较与分支
第44页:转移目标地址的表示
转移目标地址的表示
- 关键
- 确定偏移量字段的长度
- 转移目标地址的表示
- 最常用的方法在指令中提供一个偏移量,由该偏移量和程序计数器(PC)的值相加而得出目标地址。(PC相对寻址)
- 优点
- 有效地减少表示该目标地址所需要的位数。
- 位置无关(代码可被装载到主存的任意位置执行)。
第45页:过程调用和返回
过程调用和返回
- 过程调用和返回
- 除了要改变控制流之外,可能还要保存机器状态,至少也得保存返回地址(放在专用的链接寄存器或堆栈中)。
- 过去有些指令集结构提供了专门的保存机制来保存许多寄存器的内容。
- 现在较新的指令集结构则要求由编译器生成load和store指令来保存或恢复寄存器的内容。
第46页:操作数的类型和大小:数据表示
操作数的类型和大小:数据表示
- 数据表示
- 计算机硬件能够直接识别、指令集可以直接调用的数据类型。
- 数据结构
- 由软件进行处理和实现的各种数据类型。研究:这些数据类型的逻辑结构与物理结构之间的关系,并给出相应的算法。系统结构设计者要解决的问题:如何确定数据表示?(软硬件取舍折中的问题)
第47页:表示操作数类型的方法有两种
表示操作数类型的方法有两种
- 表示操作数类型的方法有两种
- 由指令中的操作码指定操作数的类型。
- 带标志符的数据表示。给数据加上标识,由数据本身给出操作数类型。
- 优点:简化指令集,可由硬件自动实现一致性检查和类型转换,缩小了机器语言与高级语言的语义差距,简化编译器等。
- 缺点:由于需要在执行过程中动态检测标志符,动态开销比较大,所以采用这种方案的机器很少见。2.操作数的大小:操作数的位数或字节数。主要的大小:字节(8位)、半字(16位)字(32位)、双字(64位)
第48页:操作数的类型和大小:字符
操作数的类型和大小:字符
- 字符
- 用ASCII码表示,为一个字节大小。
- 整数
- 用二进制补码表示,其大小可以是字节、半字或单字。
- 浮点操作数
- 单精度浮点数(1个字)、双精度浮点数(双字)。一般都采用IEEE 754浮点标准
- 十进制操作数类型
- 压缩十进制或二进制编码十进制(BCD码):用4位二进制编码表示数字0~9,并将两个十进制数字合并到一个字节中存储。
- 非压缩十进制:将十进制数直接用字符串来表示。
第49页:访问不同操作数大小的频度
访问不同操作数大小的频度
- 访问不同操作数大小的频度(SPEC基准程序)访问频度操作数大小浮点平均整型平均0%7%字节0%19%半字31%74%单字69%0%双字基准程序对单字和双字的数据访问具有较高的频度。一台32位的机器应该支持8、16、32位整型操作数以及32位和64位的IEEE 754标准的浮点操作数。
第50页:指令由两部分组成
指令由两部分组成
- 指令由两部分组成
- 操作码、地址码
- 指令格式的设计确定指令字的编码方式,包括操作码字段和地址码字段的编码和表示方式。
- 操作码的编码比较简单和直观
- Huffman编码法减少操作码的平均位数,但所获得的编码是变长的,不规整,不利于硬件处理。
- 固定长度的操作码保证操作码的译码速度。
第51页:两种表示寻址方式的方法
两种表示寻址方式的方法
- 两种表示寻址方式的方法
- 将寻址方式编码于操作码中,由操作码描述相应操作的寻址方式。适合:处理机采用load-store结构,寻址方式只有很少几种。
- 设置专门的地址描述符,由地址描述符表示相应操作数的寻址方式。适合:处理机具有多种寻址方式,且指令有多个操作数。
第52页:指令格式的设计:考虑因素
指令格式的设计:考虑因素
- 考虑因素
- 机器中寄存器的个数和寻址方式的数目对指令平均字长的影响以及它们对目标代码大小的影响。
- 所设计的指令格式便于硬件处理,特别是流水实现。
- 指令字长应该是字节(8位)的整数倍,而不能是随意的位数。6.指令集的3种编码格式变长编码格式、定长编码格式、混合型编码格式
第53页:变长编码格式
变长编码格式
- 变长编码格式
- 当指令集的寻址方式和操作种类很多时,这种编码格式是最好的。
- 用最少的二进制位来表示目标代码。
- 可能会使各条指令的字长和执行时间相差很大。
第54页:定长编码格式
定长编码格式
- 定长编码格式
- 将操作类型和寻址方式一起编码到操作码中。
- 当寻址方式和操作类型非常少时,这种编码格式非常好。
- 可以有效地降低译码的复杂度,提高译码的速度。
- 大部分RISC的指令集均采用这种编码格式。
第55页:混合型编码格式
混合型编码格式
- 混合型编码格式
- 提供若干种固定的指令字长。
- 以期达到既能够减少目标代码长度又能降低译码复杂度的目标。
第56页:MIPS的寄存器数据表
MIPS的寄存器数据表
本页含数据表/图示,源文件文字与数字粘连,未能安全切分为表格,以下为原文提取文字,具体数值请对照原课件图片核对。
1.32个64位通用寄存器(GPRs)R0,R1,…,R31也被称为整数寄存器R0的值永远是02.32个64位浮点数寄存器(FPRs)F0,F1,…,F312.6 MIPS指令集结构介绍MIPS64的一个子集,简称为MIPS。器
第57页:MIPS指令集结构
MIPS指令集结构
- 构
- 用来存放32个单精度浮点数(32位),也可以用来存放32个双精度浮点数(64位)。
- 存储单精度浮点数(32位)时,只用到FPR的一半,其另一半没用。3.一些特殊寄存器
- 它们可以与通用寄存器交换数据。
- 例如,浮点状态寄存器用来保存有关浮点操作结果的信息。
第58页:构1.MIPS的数据表示
构1.MIPS的数据表示
- 构1.MIPS的数据表示
- 整数字节(8位)半字(16位)字(32位)双字(64位)
- 浮点数单精度浮点数(32位)双精度浮点数(64位)2.字节、半字或者字在装入64位寄存器时,用零扩展或者用符号位扩展来填充该寄存器的剩余部分。装入以后,对它们将按照64位整数的方式进行运算。示
第59页:构1.立即数寻址与偏移量寻址立即数字段和
构1.立即数寻址与偏移量寻址立即数字段和
- 构1.立即数寻址与偏移量寻址立即数字段和偏移量字段都是16位的。2.寄存器间接寻址是通过把0作为偏移量来实现的3.16位绝对寻址是通过把R0(其值永远为0)作为基址寄存器来完成的4.MIPS的存储器是按字节寻址的,地址为64位5.所有存储器访问都必须是边界对齐的式
第60页:MIPS的指令格式
MIPS的指令格式
- 构
- 寻址方式编码到操作码中
- 所有的指令都是32位的
- 操作码占6位4.3种指令格式式
第61页:MIPS指令集结构
MIPS指令集结构
- 构
- I类指令
- 包括所有的load和store指令、立即数指令、,分支指令、寄存器跳转指令、寄存器链接跳转指令。
- 立即数字段为16位,用于提供立即数或偏移量。
第62页:MIPS指令集结构
MIPS指令集结构
- 构
- load指令访存有效地址:Regs[rs]+immediate从存储器取来的数据放入寄存器rt
- store指令访存有效地址:Regs[rs]+immediate要存入存储器的数据放在寄存器rt中
- 立即数指令Regs[rt] ← Regs[rs] op immediate
- 分支指令转移目标地址:Regs[rs]+immediate,rt无用
- 寄存器跳转、寄存器跳转并链接转移目标地址为Regs[rs]
第63页:MIPS指令集结构
MIPS指令集结构
- 构
- R类指令
- 包括ALU指令、专用寄存器读/写指令、move指令等。
- ALU指令Regs[rd]← Regs[rs] funct Regs[rt]func为具体的运算操作编码
第64页:MIPS指令集结构
MIPS指令集结构
- 构
- J类指令
- 包括跳转指令、跳转并链接指令、自陷指令、异常返回指令。
- 在这类指令中,指令字的低26位是偏移量,它与PC值相加形成跳转的地址。
第65页:构1.MIPS指令可以分为四大类
构1.MIPS指令可以分为四大类
- x←ny
- 从y传送n位到x
- x,y←z
- 把z传送到x和y作
- 构1.MIPS指令可以分为四大类
- load和store
- ALU操作
- 分支与跳转
- 浮点操作2.符号的意义
第66页:MIPS指令集结构
MIPS指令集结构
- 下标
- 表示字段中具体的位;
- Mem
- 表示主存;
- 上标
- 用于表示对字段进行复制的次数。例如:032:一个32位长的全0字段
第67页:MIPS指令集结构
MIPS指令集结构
- 符号##
- 用于两个字段的拼接,并且可以出现在数据传送的任何一边。举例:R8、R10:64位的寄存器,则Regs[R8]32..63←32(Mem [Regs[R6]]0)24## Mem [Regs[R6]]表示的意义是:以R6的内容作为地址访问内存,得到的字节按符号位扩展为32位后存入R8的低32位,R8的高32位(即Regs[R8]0..31)不变。
第68页:MIPS指令集结构数据表
MIPS指令集结构数据表
本页含数据表/图示,源文件文字与数字粘连,未能安全切分为表格,以下为原文提取文字,具体数值请对照原课件图片核对。
3.load和store指令含义指令名称指令举例Regs[R2]←64Mem[20+Regs[R3]]装入双字LD R2,20(R3)Regs[R2]←64(Mem[40+Regs[R3]]0)32##Mem[40+Regs[R3]]装入字LW R2,40(R3)Regs[R2]←64(Mem[30+Regs[R3]]0)56##Mem[30+Regs[R3]]装入字节LB R2,30(R3)Regs[R2]←64056## Mem[40+Regs[R3]]装入无符号字节LBU R2,40(R3)Regs[R2]←64(Mem[30+Regs[R3]]0)48##Mem[30+Regs[R3]]## Mem[31+Regs[R3]]装入半字LH R2,30(R3)Regs[F2]←64Mem[60+Regs[R4]] ## 032装入半字L.S F2,60(R4)Regs[F2]←64Mem[40+Regs[R3]]装入双精度浮点数L.D F2,40(R3)Mem[300+Regs[R5]]←64Regs[R4]保存双字SD R4,300(R5)Mem[300+Regs[R5]]←32Regs[R4]保存字SW R4,300(R5)Mem[40+Regs[R2]]←32Regs[F2]0··31保存单精度浮点数S.S F2,40(R2)Mem[502+Regs[R4]]←16Regs[R5]48··.63保存半字SH R5,502(R4)
第69页:MIPS指令集结构数据表
MIPS指令集结构数据表
本页含数据表/图示,源文件文字与数字粘连,未能安全切分为表格,以下为原文提取文字,具体数值请对照原课件图片核对。
4.ALU指令寄存器-寄存器型(RR型)指令或立即数型算术和逻辑操作:加、减、与、或、异或和移位等含义指令名称指令举例Regs[R1]← Regs[R2]+ Regs[R3]无符号加DADDUR1,R2,R3Regs[R4]← Regs[R5]+6加无符号立即数DADDIUR4,R5,#6Regs[R1]← 032## 4 ## 016把立即数装入到一个字的高16位LUIR1,#4Regs[R1]← Regs[R2]<<5逻辑左移DSLLR1,R2,#5If(Regs[R2]< Regs[R3])Regs[R1]← 1 else Regs[R1]←0置小于DSLT R1,R2,R3
第70页:R0的值永远是0,它可以用来合成一些常用
R0的值永远是0,它可以用来合成一些常用
- R0的值永远是0,它可以用来合成一些常用的操作。例如:DADDIU R1,R0,#100//给寄存器R1装入常数100DADD R1,R0,R2//把寄存器R2中的数据传送到寄存器R1
第71页:构1.由一组跳转和一组分支指令来实现控制
构1.由一组跳转和一组分支指令来实现控制
- 构1.由一组跳转和一组分支指令来实现控制流的改变2.典型的MIPS控制指令令
第72页:MIPS的控制指令数据表
MIPS的控制指令数据表
本页含数据表/图示,源文件文字与数字粘连,未能安全切分为表格,以下为原文提取文字,具体数值请对照原课件图片核对。
含义指令名称指令举例PC36··63← name<<2跳转J nameRegs[R31]←PC+4;PC36··63←name<<2;((PC+4)-227)≤name<((PC+4)+227)跳转并链接JAL nameRegs[R31]←PC+4;PC← Regs[R3]寄存器跳转并链接JALR R3PC← Regs[R5]寄存器跳转JR R5if(Regs[R4]== 0) PC←name;((PC+4)-217)≤name<((PC+4)+217)等于零时分支BEQZ R4,nameif(Regs[R3]!= Regs[R4]) PC←name((PC+4)-217)≤name<((PC+4)+217)不相等时分支BNE R3,R4,nameif(Regs[R3]==0) Regs[R1]←Regs[R2]等于零时移动MOVZ R1,R2,R3
第73页:构3.跳转指令
构3.跳转指令
- 构3.跳转指令
- 根据跳转指令确定目标地址的方式不同以及跳转时是否链接,可以把跳转指令分成4种。
- 确定目标地址的方式
- 把指令中的26位偏移量左移2位(因为指令字长都是4个字节)后,替换程序计数器的低28位。
- 间接跳转:由指令中指定的一个寄存器来给出转移目标地址。
- 跳转的两种类型
- 简单跳转:把目标地址送入程序计数器。
- 跳转并链接:把目标地址送入程序计数器,把返回地址(即顺序下一条指令的地址)放入寄存器R31。
第74页:构4.分支指令(条件转移)
构4.分支指令(条件转移)
- 分支条件由指令确定。例如
- 测试某个寄存器的值是否为零
- 一条浮点条件分支指令
- 通过测试浮点状态寄存器来决定是否进行分支。
- 构4.分支指令(条件转移)
- 提供一组比较指令,用于比较两个寄存器的值。例如:“置小于”指令
- 有的分支指令可以直接判断寄存器内容是否为负,或者比较两个寄存器是否相等。
- 分支的目标地址。由16位带符号偏移量左移两位后和PC相加的结果来决定
第75页:构1.由操作码指出操作数是单精度(SP)
构1.由操作码指出操作数是单精度(SP)
- 后缀S
- 表示操作数是单精度浮点数
- 后缀D
- 表示是双精度浮点数2.浮点操作包括加、减、乘、除,分别有单精度和双精度指令。3.浮点数比较指令
- 构1.由操作码指出操作数是单精度(SP)或双精度(DP)
- 根据比较结果设置浮点状态寄存器中的某一位,以便于后面的分支指令BC1T(若真则分支)或BC1F(若假则分支)测试该位,以决定是否进行分支。作