Download presentation
Presentation is loading. Please wait.
1
第2章 计算机指令集结构 授课教师:车喜龙
2
2.1 指令集结构的分类 2.2 寻址方式 2.3 指令集结构的功能设计 2.4 操作数的类型和大小 2.5 指令格式的设计 2.6 MIPS指令集结构
3
2.1 指令集结构的分类 区别不同指令集结构的主要因素 CPU中用来存储操作数的存储单元的类型 CPU中用来存储操作数的存储单元的主要类型
堆栈 累加器 通用寄存器组 将指令集结构分为三种类型(接下页)
4
堆栈结构 累加器结构 通用寄存器结构 2.1 指令集结构的分类 根据操作数的来源不同,又可进一步分为: 寄存器-存储器结构(RM结构)
(操作数可以来自存储器 ) 寄存器-寄存器结构(RR结构) (所有操作数都是来自通用寄存器组) 也称为load-store结构,这个名称强调:只有load指令和store指令能够访问存储器。
5
对于不同类型的指令集结构,操作数的位置、个数以及操作数的给出方式(显式或隐式)也会不同。
2.1 指令集结构的分类 对于不同类型的指令集结构,操作数的位置、个数以及操作数的给出方式(显式或隐式)也会不同。 显式给出:用指令字中的操作数字段给出 隐式给出:使用事先约定好的存储单元 4种指令集结构的操作数的位置以及结果的去向 (图见下页)
6
堆栈结构 栈顶=栈顶op次栈顶 隐式约定 Push/Pop访存 累加器结构 累加=累加 op Mem 半隐式约定 LD/ST访存 RM结构 Rd=Rs op Mem 显式约定 LD/ST访存 RR结构 Rd=Rs op Rt 显式约定 LD/ST访存 灰色块:操作数 黑色块:结果 TOS(Top Of Stack):栈顶
7
假设:A、B、C均保存在存储器单元中,并且不能 破坏A和B的值。
2.1 指令集结构的分类 例: 表达式C=A+B在4种类型指令集结构上的代码。 假设:A、B、C均保存在存储器单元中,并且不能 破坏A和B的值。 堆 栈 累加器 寄存器(RM型) 寄存器(RR型) push A load A load R1,A push B add B add R1,B load R2,B add store C store R1,C add R3,R1,R2 pop C store R3,C ALU 无操作数 ALU 1操作数 ALU 2操作数 ALU 3操作数
8
三种类型指令集结构的优缺点 2.1 指令集结构的分类 指令集结构类型 优 点 缺 点 堆栈型 是一种表示计算的简单模型;指令短小。
优 点 缺 点 堆栈型 是一种表示计算的简单模型;指令短小。 堆栈不能被随机访问,从而很难生成有效代码。同时,由于堆栈是瓶颈,所以很难被高效地实现。 累加器型 减小了机器的内部状态;指令短小。 由于累加器是唯一的暂存器,这种机器的存储器通信开销最大。 寄存器型 是代码生成最一般的模型。 所有操作数均需命名,且显式表示,因而指令比较长。
9
跟其他的CPU内部缓冲单元一样,寄存器的访问 速度比存储器快,相当于ALU提速了。
2.1 指令集结构的分类 通用寄存器结构 现代指令集结构的主流 在灵活性和提高性能方面有明显的优势 跟其他的CPU内部缓冲单元一样,寄存器的访问 速度比存储器快,相当于ALU提速了。 相对于存储器地址来说,寄存器进行寻址用更少的地址位,从而有效地减少程序的目标代码的大小。 对编译器而言,能更加容易、有效地分配和使用寄存器。 寄存器可以用来存放中间变量,从而减少对存储器的访问,加快程序的执行速度;
10
根据ALU指令的操作数的两个特征对通用寄存器型指 令集结构进一步细分 特征1:ALU指令的操作数个数
2.1 指令集结构的分类 根据ALU指令的操作数的两个特征对通用寄存器型指 令集结构进一步细分 特征1:ALU指令的操作数个数 3个操作数的指令 两个源操作数、一个目的操作数 2个操作数的指令 其中一个操作数既作为源操作数,又作为目的操作数。 特征2:ALU指令中存储器操作数的个数 可以是0~3中的某一个,为0表示没有存储器操作数。 (例子见下页)
11
ALU指令中操作数个数和存储器操作数个数的典型组合
储器操作数的个数 ALU指令中 操作数的最多个数 结构 类型 机器实例 3 RR MIPS,SPARC,Alpha,PowerPC,ARM 1 2 RM IBM 360/370,Intel 80x86,Motorola 68000 IBM 360/370 MM VAX
12
通用寄存器型指令集结构进一步细分为3种类型 寄存器-寄存器型(RR型) 寄存器-存储器型(RM型) 存储器-存储器型(MM型)
2.1 指令集结构的分类 通用寄存器型指令集结构进一步细分为3种类型 寄存器-寄存器型(RR型) 寄存器-存储器型(RM型) 存储器-存储器型(MM型) 3种通用寄存器型指令集结构的优缺点 下页表中(m,n)表示指令的n个操作数中有m个存 储器操作数。
13
指令集结构类型 优 点 缺 点 寄存器-寄存器型 (0,3) 简单,指令字长固定,是一种简单的代码生成模型,各种指令的执行时钟周期数相近。 和指令中含有对存储器操作数访问的结构相比,指令条数多,因而其目标代码较大。(如:多了很多LD/ST指令) 寄存器-存储器型 (1,2) 可以直接对存储器操作数进行访问,容易对指令进行编码,且其目标代码较小。 指令中的操作数类型不同。在一条指令中同时对一个寄存器操作数和存储器操作数进行编码,将限制指令所能够表示的寄存器个数。由于指令的操作数可以存储在不同类型的存储器单元,所以每条指令的执行时钟周期数也不尽相同。 存储器-存储器型(3,3) 是一种最紧密的编码方式,无需“浪费”寄存器保存变量。 指令字长多种多样。每条指令的执行时钟周期数也大不一样,对存储器的频繁访问将导致存储器访问瓶颈问题。
14
2.2 寻址方式 一种指令集结构如何确定所要访问的数据的地址?
在通用寄存器指令集结构中,一般利用寻址方式指明指令中的操作数是一个常数、一个寄存器操作数,抑或是一个存储器操作数 对存储器操作来说,由寻址方式确定的实际的存储器地址称为有效地址 当前的指令集结构中所采用的一些操作数寻址方式 :赋值操作 Mem:存储器 Regs:寄存器组 方括号:表示内容 Mem[ ]:存储器的内容,Regs[ ]:寄存器的内容,#立即数 Mem[Regs[R1]]:以R1中的内容作为地址的存储器单元中的内容 (各种具体实例见下页)
15
寻址方式 指令实例 含 义 寄存器寻址 立即值寻址 偏移寻址 寄存器间接寻址 索引寻址 直接寻址或 绝对寻址 存储器间接寻址 自增寻址
含 义 寄存器寻址 Add R4 , R3 Regs[R4]←Regs[R4]+Regs[R3] 立即值寻址 Add R4 , #3 Regs[R4]←Regs[R4]+3 偏移寻址 Add R4 , 100(R1) Regs[R4]←Regs[R4]+Mem[100+Regs[R1]] 寄存器间接寻址 Add R4 , (R1) Regs[R4]←Regs[R4]+Mem[Regs[R1]] 索引寻址 Add R3 , (R1 + R2) Regs[R3]←Regs[R3]+Mem[Regs[R1]+Regs[R2]] 直接寻址或 绝对寻址 Add R1 , (1001) Regs[R1]←Regs[R1]+Mem[1001] 存储器间接寻址 Add R1 Regs[R1]←Regs[R1]+Mem[Mem[Regs[R3]]] 自增寻址 Add R1 , (R2)+ Regs[R1]←Regs[R1]+Mem[Regs[R2]] Regs[R2]←Regs[R2]+d 自减寻址 Add R1, -(R2) Regs[R2]←Regs[R2]-d Regs[R1]←Regs[R1]+Mem[Regs[R2]] 缩放寻址 Add R1 , 100(R2)[R3] Regs[R1]←Regs[R1]+Mem[100+Regs[R2]+Regs[R3]*d]
16
关于寻址方式的几点说明 采用多种寻址方式可以显著地减少程序的指令条数,但可能增加计算机的实现复杂度以及指令的CPI。
2.2 寻址方式 关于寻址方式的几点说明 采用多种寻址方式可以显著地减少程序的指令条数,但可能增加计算机的实现复杂度以及指令的CPI。 一般来说,一个指令集结构会根据应用需求选择上表中的几种,可能是子集,也可能是超集。例如,表中没有包含的PC相对寻址 有效地址=func(PC,R,#) 自增,自减寻址可用于一维数组循环处理,缩放寻址可用于二维数组循环处理,只有当所要访问的数据元素在存储器中相邻,而且每个被访问的数据项的大小均为d(如,d=4B=1W=32bit 或d=8B=DW=64bit)时,这些寻址方式才有意义
17
在指令集结构设计时,到底支持哪些寻址方式好呢? 各种寻址方式的使用情况统计结果
2.2 寻址方式 在指令集结构设计时,到底支持哪些寻址方式好呢? 各种寻址方式的使用情况统计结果 在VAX机器上运行gcc、Spice和Tex 基准程序 立即数寻址方式和偏移寻址方式的使用频度最高。
18
偏移寻址中,如何确定偏移量的最大取值范围?
2.2 寻址方式 偏移寻址中,如何确定偏移量的最大取值范围? (即,在偏移寻址的设计中,用多少位来表示偏移量) 寄存器-寄存器型指令集结构的机器上(MIPS) ◆ 运行SPECint92基准程序集 (compress、espresso、eqntott、gcc、li) ◆ 运行SPECfp92基准程序集 (dudoc、ear、hydro2d、mdljdp2、su2cor) ◆ x轴的标记是对偏移量大小进行log2(·)运算所 得,也就是偏移量字段的位数。
19
2.2 寻址方式 从该图可以看出: 程序所使用的偏移量大小分布十分广泛; 较小的偏移量和较大的偏移量均占有相当大的比例; 将偏移量字段的大小设置为12~16位。这种长度可以支持上述75%~99%基于偏移寻址方式的数据访问中偏移量大小的表示。
20
在一种Load/Store型指令集结构上,一些指令使用立即值寻址方式的频率
2.2 寻址方式 立即数寻址方式 立即数寻址方式的使用频度 在一种Load/Store型指令集结构上,一些指令使用立即值寻址方式的频率 比较指令和ALU指令使用立即值寻址方式十分频繁。
21
(即,在立即数寻址的设计中,用多少位来表示立即数,从而影响指令的字长)
2.2 寻址方式 立即数寻址中,如何确定立即数的取值范围 (即,在立即数寻址的设计中,用多少位来表示立即数,从而影响指令的字长) 解释 见下页
22
从该图可以看出: 将立即值的大小设置为8~16位,可以覆盖所有 使用立即值寻址方式指令的50%~80%。 2.2 寻址方式
最常用的是较小的立即数; 有时也会用到较大的立即数(主要是用于地址计算)。 在指令集结构设计中,至少要将立即数的大小设置 为8~16位。 在VAX机(支持32位立即数)上做过类似的统计,结果 表明20%~25%的立即数超过16位。 将立即值的大小设置为8~16位,可以覆盖所有 使用立即值寻址方式指令的50%~80%。
23
2.3 指令集结构的功能设计 指令集结构的功能设计 确定软、硬件功能分配,即确定哪些基本功能应该由硬件实现,哪些功能由软件实现比较合适。
在确定哪些基本功能用硬件来实现时,主要考虑3个因素:速度、成本、灵活性 硬件实现的特点 速度快、成本高、灵活性差 软件实现的特点 速度慢、价格便宜、灵活性好
24
完整性:在一个有限可用的存储空间内,对于任何可解的问题,编制计算程序时,指令集所提供的指令足够用。
2.3 指令集结构的功能设计 对指令集的基本要求 完整性、规整性、高效率、兼容性 完整性:在一个有限可用的存储空间内,对于任何可解的问题,编制计算程序时,指令集所提供的指令足够用。 要求指令集功能齐全、使用方便 下页表为许多指令集结构都包含的一些指令类型 前4类属于通用计算机系统的基本指令 对于最后4种类型的操作,不同指令集结构的支 持大不相同 。(不支持怎么办?) 不支持的前提是,用基本指令能够模拟,满足完整性
25
算术运算和逻辑操作:加,减,乘,除,与,或等
2.3 指令集结构的功能设计 操作类型 实 例 算术和逻辑运算 算术运算和逻辑操作:加,减,乘,除,与,或等 数据传输 load,store 控制 分支,跳转,过程调用和返回,自陷等 系统 操作系统调用,虚拟存储器管理等 浮点 浮点操作:加,减,乘,除,比较等 十进制 十进制加,十进制乘,十进制到字符的转换等 字符串 字符串移动,字符串比较,字符串搜索等 图形 像素操作,压缩/解压操作等
26
规整性:主要包括对称性和均匀性。 2.3 指令集结构的功能设计 对称性:所有与指令集有关的存储单元的使用、 操作码的设置等都是对称的。
例如:在存储单元的使用上,所有通用寄存器都要同等对 待。在操作码的设置上,如果设置了A-B的指 令,就应该也设置B-A的指令。 均匀性:指对于各种不同的操作数类型、字长、操作 种类和数据存储单元,指令的设置都要同等对待。 例如:如果某机器有5种数据表示,4种字长,两种存储单 元,则要设置5×4×2=40种同一操作的指令。 绝对的完整性,相对的规整性
27
高效率:指指令的执行速度快、使用频度高。 兼容性:新版本指令集兼容老程序和主流编译器。 一种指令集结构中的指令到底要支持哪些类型的操作?
2.3 指令集结构的功能设计 高效率:指指令的执行速度快、使用频度高。 兼容性:新版本指令集兼容老程序和主流编译器。 一种指令集结构中的指令到底要支持哪些类型的操作? 在设计指令集结构时,有两种截然不同的设计策略,因此也产生了两类不同的计算机系统 CISC(复杂指令集计算机) 增强指令功能,把越来越多的功能交由硬件来实 现,并且指令的数量也是越来越多。 RISC(精简指令集计算机) 尽可能地把指令集简化,不仅指令的条数少,而且 指令的功能也比较简单。
28
2.3.1 CISC指令集结构的功能设计 CISC结构追求的目标 强化指令功能,减少程序的(编译后)指令条数,以达到提高性能的目的。
2.3 指令集结构的功能设计 2.3.1 CISC指令集结构的功能设计 CISC结构追求的目标 强化指令功能,减少程序的(编译后)指令条数,以达到提高性能的目的。 增强指令功能主要是从以下几个方面着手: 面向目标程序增强指令功能 面向高级语言的优化实现来改进指令集 面向操作系统的优化实现改进指令集
29
通过对目标程序及其执行情况进行性能分析,找出使用频度高,执行时间长的指令或指令串。对于高频指令,硬件加速;对于高频指令串,用一条新指令替代。
2.3 指令集结构的功能设计 面向目标程序增强指令功能 通过对目标程序及其执行情况进行性能分析,找出使用频度高,执行时间长的指令或指令串。对于高频指令,硬件加速;对于高频指令串,用一条新指令替代。 增强运算型指令的功能(如科学计算函数) 增强数据传送指令的功能(如批量数据传输) 增强程序控制指令的功能(如循环控制,见下页例) 丰富的增强指令为编程提供了多种选择,但也增加了硬件的成本和复杂度。(TradeOff)
30
例如:循环在程序中占有相当大的 比例,所以在指令上提供专 门的支持。 2.3 指令集结构的功能设计 循环控制部分通常用3条指令完成:
一条加法指令 一条比较指令 一条分支指令 设置循环控制指令,用一条指令完成上述3条指令的功能。 一般循环程序的结构
31
(1)很多性能开销是有高级语言和机器语言的语义差距造成的,如果能够让指令集增加对高级语言的支持,缩小这些语义差距,能够有效的提高系统性能。
2.3 指令集结构的功能设计 面向高级语言的优化实现来改进指令集 (1)很多性能开销是有高级语言和机器语言的语义差距造成的,如果能够让指令集增加对高级语言的支持,缩小这些语义差距,能够有效的提高系统性能。 站在高级语言分析的角度,对源程序中各种高级语言语句进行使用频度的统计与分析,对使用频度高的语句,可以设置专门的指令或采取措施增加相应指令的功能,以提高其编译速度和执行速度 站在方便编译程序的角度,尤其是从编译优化代码生成的角度,提高指令集结构的规整性,减少例外情况,从而减少例外给编译器带来的额外处理工作。
32
(2)建立直接面向高级语言的计算机,理想情况下,使高级语言直接成为汇编语言,甚至使高级语言直接成为机器语言
2.3 指令集结构的功能设计 面向高级语言的优化实现来改进指令集 (2)建立直接面向高级语言的计算机,理想情况下,使高级语言直接成为汇编语言,甚至使高级语言直接成为机器语言 间接执行高级语言机器 高级语言成为机器的汇编语言,这时高级语言和机器语言是一一对应的。用汇编的方法把高级语言源程序翻译成机器语言程序。 直接执行高级语言的机器 直接把高级语言作为机器语言,直接由固件/硬件对高级语言源程序的语句逐条进行解释执行。这时既不用编译,也不用汇编。
33
2.3 指令集结构的功能设计
34
面向操作系统的优化实现改进指令集 2.3 指令集结构的功能设计 操作系统和计算机系统结构是紧密联系的,操作系
统的实现在很大程度上取决于系统结构的支持。 指令集对操作系统的支持主要有: 处理机工作状态和访问方式的切换。 进程的管理和切换。 存储管理和信息保护。 进程的同步与互斥,信号灯的管理等。 中断处理 支持操作系统的有些指令属于特权指令,一般用户 程序是不能使用的。
35
2.3 指令集结构的功能设计 2.3.2 RISC指令集结构的功能设计 CISC指令集结构存在的缺点 (1979年开始,UC-Berkeley Patterson等人的研究) 在CISC结构的指令系统中,各种指令的使用频率相差悬殊。 (二八一九原理,尽信书不如无书) CISC结构指令系统的复杂性带来了计算机体系结构的复杂性,这不仅增加了研制时间和成本,而且还容易造成设计错误。 CISC结构指令系统的复杂性给VLSI设计增加了很大负担,不利于单片集成。 CISC结构的指令系统中,许多复杂指令需要很复杂的操作,运行速度反而慢。 在CISC结构的指令系统中,由于各条指令的功能不均衡性,不利于采用先进的计算机体系结构技术(如流水技术)来提高系统的性能。
36
Intel 80x86最常用的10条指令 执行频度排序 80x86指令 指令执行频度(占执行指令总数的百分比) 1 load 22% 2
条件分支 20% 3 比较 16% 4 store 12% 5 加 8% 6 与 6% 7 减 5% 8 寄存器-寄存器间数据移动 4% 9 调用子程序 1% 10 返回 合 计 95%
37
2.3 指令集结构的功能设计 设计RISC机器遵循的设计原则
指令条数少而简单。只选取使用频度很高的指令,在此基础上补充一些最有用的指令保证完整性。 采用简单而又统一的指令格式,并减少寻址方式;指令字长都为32位或64位。 每条指令的功能应尽可能简单,并在单个机器周期内完成,充分利用流水技术来提高性能。 只有load和store指令才能访问存储器,其他指令的操作都是在寄存器之间进行。(即采用load-store结构) 大多数指令都采用硬连逻辑来实现。 以简单有效的方式支持高级语言和编译程序,强调优化编译器的作用,为高级语言程序生成优化的代码。
38
1981年 ,Berkeley分校的Patterson 等人的32位微处理器RISC I :
2.3 指令集结构的功能设计 早期的RISC微处理器 1981年 ,Berkeley分校的Patterson 等人的32位微处理器RISC I : 31条指令,指令字长都是32位,78个通用寄存器,时钟频率为8 MHz; 控制部分所占的芯片面积只有约6%。商品化微处理器MC68000和Z8000分别为50%和53%; 性能比MC68000和Z8000快3~4倍。 1983年的RISCⅡ: 指令条数为39,通用寄存器个数为138,时钟频率为12 MHz。 后来发展成了Sun公司的SPARC系列微处理器。
39
1981年,Stanford大学Hennessy等人的MIPS IBM的801 共同特点:
2.3 指令集结构的功能设计 1981年,Stanford大学Hennessy等人的MIPS 后来发展成了MIPS Rxxx系列微处理器。 IBM的801 共同特点: 采用load-store结构 固定指令字长,为32位 采用高效的流水技术 现在的玩法 如Intel、AMD等 CPU对外为CISC,CPU内部将CISC转为RISC
40
2.3.3 控制指令 控制指令是用来改变控制流的。 跳转:当指令是无条件改变控制流时,称之为跳转指令。
2.3 指令集结构的功能设计 2.3.3 控制指令 控制指令是用来改变控制流的。 跳转:当指令是无条件改变控制流时,称之为跳转指令。 分支:当控制指令是有条件改变控制流时,则称之为分支指令。 能够改变控制流的指令 分支 跳转 过程调用 过程返回
41
表中可以看出,改变控制流的大部分指令是分支指令(条件转移),因此如何表示分支条件就显得尤其重要。
2.3 指令集结构的功能设计 控制指令的使用频度 (load-store型指令集结构的机器,基准程序为SPEC CPU2000) 指令类型 使用频度 整型平均 浮点平均 调用/返回 19% 8% 跳转 6% 10% 分支 75% 82% 表中可以看出,改变控制流的大部分指令是分支指令(条件转移),因此如何表示分支条件就显得尤其重要。
42
在程序的控制下,由ALU操作设置特殊的位。 可以自由设置分支条件。
常用的3种表示分支条件的方法及其优缺点 表示分支条件的技术 测试分支条件的方法 优 点 缺 点 条件码(CC) 在程序的控制下,由ALU操作设置特殊的位。 可以自由设置分支条件。 CC是额外状态,条件码限制了指令顺序,因为必须从一条指令将分支条件信息传送到分支指令。 条件寄存器 比较指令把比较结果放入一个寄存器,检测时读取该寄存器。 简单 占用了一个寄存器。 比较且分支 比较操作是分支指令的一部分,通常这种比较是受一定限制的。 一条指令完成了两条指令的功能。 分支指令的操作增多,不利于流水。
43
关键:转移目标离当前控制指令的偏移量有多大?
2.3 指令集结构的功能设计 转移目标地址的表示 最常用的方法:PC相对寻址 在指令中提供一个偏移量,由该偏移量和程序计数 器(PC)的值相加而得出目标地址。 优点 有效地缩短指令中表示目标地址的字段的长度; 使得代码的执行与它被载入的位置无关。 关键:转移目标离当前控制指令的偏移量有多大? 模拟结果表明:采用4~8位的偏移量字段(以指令字为单位)就能表示大多数控制指令的转移目标地址了。
44
除了要改变控制流之外,可能还要保存机器状态,至少也得保存返回地址(放在专用的链接寄存器或堆栈中)。
2.3 指令集结构的功能设计 过程调用和返回 除了要改变控制流之外,可能还要保存机器状态,至少也得保存返回地址(放在专用的链接寄存器或堆栈中)。 过去有些指令集结构提供了专门的保存机制来保存许多寄存器的内容。 现在较新的指令集结构则要求由编译器生成load和store指令来保存或恢复寄存器的内容。
45
在一个调用者调用别的过程时,必须保存调用者所要保存的寄存器,以备调用结束返回后,能够再次访问调用者。
2.3 指令集结构的功能设计 过程调用和返回时的状态保存方法 “调用者保存”方法 在一个调用者调用别的过程时,必须保存调用者所要保存的寄存器,以备调用结束返回后,能够再次访问调用者。 “被调用者保存”方法 被调用的过程必须保存它要用的寄存器,保证不会破坏过程调用者的程序执行环境,并在过程调用结束返回时,恢复这些寄存器的内容。 (图示见下页)
46
2.3 指令集结构的功能设计
47
2.4 操作数的类型和大小 数据表示:计算机硬件能够直接识别、指令集可以直接调用的数据类型。(硬件意义上的操作数)
数据结构:由软件进行处理和实现的各种数据类型,数据表示之外的所有数据类型都是数据结构的研究内容。(软件意义上的操作数) 系统结构设计者要解决的问题:如何数据类型的软硬分界面? 只把最简单的归入数据表示,其他类型都归入数据结构,降低系统性能 所有类型都归入数据表示,硬件成本太高 实际设计中,软硬件取舍折中,即将最常用、相对比较简单、用硬件实现比较容易的几种归入数据表示,其余归入数据结构
48
带标志符的数据表示。给数据加上标识,由数据本身给出操作数类型。
2.4 操作数的类型和大小 操作数的类型表示方法 由指令中的操作码指定操作数的类型。 带标志符的数据表示。给数据加上标识,由数据本身给出操作数类型。 优点:简化指令集,可由硬件自动实现一致性检查和类型转换,缩小了机器语言与高级语言的语义差距,简化编译器等。 缺点:由于需要硬件在执行过程中动态检测标志符,动态开销比较大,所以采用这种方案的机器很少见。 操作数的大小:操作数的位数或字节数。 常见的大小:字节(8位)、半字(16位) 字(32位)、双字(64位) 64位机,字(64位)
49
字符:用ASCII码表示,为一个字节大小。 整数:用二进制补码表示,其大小可以是字节、半字或单字。
2.4 操作数的类型和大小 字符:用ASCII码表示,为一个字节大小。 整数:用二进制补码表示,其大小可以是字节、半字或单字。 浮点操作数:单精度浮点数(1个字)、双精度浮点数(双字)。 一般都采用IEEE 754浮点标准 十进制操作数类型 压缩十进制或二进制编码十进制(BCD码):用4位二进制编码表示数字0~9,并将两个十进制数字合并到一个字节中存储。 非压缩十进制:将十进制数直接用字符串来表示。
50
基准程序对单字和双字的数据访问具有较高的频率。
不同操作数大小的访问频度 (SPECint92基准程序和SPECfp92基准程序) 操作数大小 访问频度 整型平均 浮点平均 字节 7% 0% 半字 19% 单字 74% 31% 双字 69% 基准程序对单字和双字的数据访问具有较高的频率。 选择操作数字段的长度为32位,可以有效支持8、16、32位整型操作数,以及32位浮点操作数的表示。 选择操作数字段长度为64位,则更具有一般性。
51
2.5 指令格式的设计 指令由两部分组成:操作码、地址码
指令格式的设计:就是确定操作码字段和地址码字段的大小及其组合形式,以及各种操作数访问方式的编码方法。 指令格式的设计原则 尽可能地增加寄存器数目和操作数访问方式类型; 充分考虑寄存器字段和操作数访问方式字段对指令平均 字长的影响,以及它们对目标代码大小的影响; 设计出的指令集格式能够在具体实现中便于硬件处理,特别是流水实现。 指令字长应该是字节(8位)的整数倍,而不能是随意的位数
52
减少操作码的平均位数,但所获得的编码是变长的,不规整,不利于硬件处理。
2.5 指令格式的设计 操作码的编码 比较简单和直观 Huffman编码法 减少操作码的平均位数,但所获得的编码是变长的,不规整,不利于硬件处理。 固定长度的操作码 保证操作码的译码速度。
53
2.5 指令格式的设计 2.5.2 操作数访问方式的编码 将操作数访问方式编码于操作码中,由操作码在描述指令操作的同时,也描述了相应操作的操作数访问方式,访问与操作一起编码; 适合:处理机采用load-store结构,操作数访问方式只有很少几种。 举例:LD.F 单字浮点; LD.IU 整型; 1001#### #### 为每个操作数设置一个地址描述符,由该地址描述符表示相应操作数的访问方式,访问与操作分开编码。 适合:处理机具有多种操作数访问方式,且指令有多个操作数,难于将访问方式和操作数一起编码的情况。 举例:LD [F] R1 浮点; LD [IU] R1 整型; 1001 [01] #### [10] ####
54
2.5.3 指令集的编码 3种编码格式 变长编码格式 2.5 指令格式的设计
指令集的编码 3种编码格式 变长编码格式 当指令集的操作数访问方式和操作种类很多时,这种编码格式是最好的。 用最少的二进制位来表示目标代码。 可能会使各条指令的字长和执行时间相差很大。 大部分CISC的指令集均采用这种编码格式。
55
定长编码格式 变长v.s.定长 2.5 指令格式的设计 将操作类型和操作数访问方式一起编码到操作码中。
当操作数访问方式和操作类型非常少时,这种编码格式非常好。 可以有效地降低译码的复杂度,提高译码的速度。 大部分RISC的指令集均采用这种编码格式。 变长v.s.定长 目标代码长度与译码简单性的TradeOff
56
混合型编码格式 2.5 指令格式的设计 综合了变长和定长的优点 提供若干种固定的指令字长。
以期达到既能够减少目标代码长度又能降低译码复杂度的目标。
57
2.6 MIPS指令集结构 本节介绍一个典型的RISC指令集——MIPS 设计思想: 不含互锁机制的流水线微处理器
(Microprocessor without Interlocked Pipeline Stages) 设计思想: 具有一个简单的Load/Store指令集; 注重指令流水效率; 简化指令的译码; 高效支持编译器。
58
2.6.1 MIPS的寄存器 2.6 MIPS指令集结构 32个64位通用寄存器(GPRs) R0,R1,…,R31 (R0的值永远是0)
也被称为整数寄存器 32个64位浮点数寄存器(FPRs) F0,F1,…,F31 用来存放32个单精度浮点数(32位),也可以用来存放32个双精度浮点数(64位)。 存储单精度浮点数(32位)时,只用到FPR的一半,其另一半没用。 一些特殊寄存器 它们可以与通用寄存器交换数据。 例如,PC指令地址寄存器保存当前PC值。
59
2.6.2 MIPS的数据表示 MIPS的数据表示 整数 浮点数
字节(8位) 半字(16位) 字(32位) 双字(64位) 浮点数 单精度浮点数(32位) 双精度浮点数(64位) 字节、半字或者字在装入64位寄存器时,用零扩展或者用符号位扩展来填充该寄存器的剩余部分。装入以后,对它们将按照64位整数的方式进行运算。单精浮点装入64位寄存器的高32位,低32位置全零。
60
2.6.3 MIPS的数据寻址方式 2.6 MIPS指令集结构 只有立即数寻址与偏移量寻址 寄存器间接寻址是通过把0作为偏移量来实现的
立即数字段和偏移量字段都是16位的 Add R3, #6 与 Add R3, 120(R2) 寄存器间接寻址是通过把0作为偏移量来实现的 ADD R4, (R2)指令用ADD R4, 0(R2) 实现 16位绝对寻址是通过把R0(其值永远为0)作为基址来完成的 ADD R4, (X) 指令用 ADD R4, X(R0) 实现 (以上实际为4种寻址方式) MIPS的存储器是按字节寻址的,绝对地址为64位地址 所有存储器访问都必须是边界对齐的
61
2.6.4 MIPS的指令格式 2.6 MIPS指令集结构 操作数访问方式编码到操作码中 所有的指令都是32位的 操作码占6位
共有3种指令格式
62
2.6 MIPS指令集结构 I类指令 包括所有的load和store指令、立即数指令、分支指令、寄存器跳转JR指令、寄存器链接跳转JALR指令。 立即数字段为16位,用于提供立即数或偏移量。
63
2.6 MIPS指令集结构 load指令 访存有效地址:Regs[rs]+immediate 从存储器取来的数据放入寄存器rt store指令 要存入存储器的数据放在寄存器rt中 立即数指令 Regs[rt] ← Regs[rs] op immediate 分支指令 转移目标地址:Regs[rs]+immediate,rt无用 寄存器跳转、寄存器跳转并链接 转移目标地址为 Regs[rs]
64
2.6 MIPS指令集结构 R类指令 包括ALU指令、专用寄存器读/写指令、move指令等。 ALU指令
Regs[rd]← Regs[rs] func Regs[rt] func为具体的运算操作编码 shamnt为移位操作移动的位数
65
J类指令 2.6 MIPS指令集结构 包括跳转指令、跳转并链接指令、自陷指令、异常返回指令。
在这类指令中,指令字的低26位是偏移量,它与PC值相加形成跳转的地址。
66
2.6.5 MIPS的操作 2.6 MIPS指令集结构 MIPS指令可以分为四大类操作 load和store操作 ALU操作 分支与跳转操作
浮点操作 符号的意义约定 (1) 符号“”: 数据传送操作 其后附带一个下标n,也即“n” 表示传送 一个n位数据。 (2) 符号“##”: 两个域的串联操作,相当于字符串拼接 (未完接下页)
67
域中位的标记是从最高位开始标记,并且起始标记为0。 下标可以是一个单独的数字。 如 Regs[R4]0 :选择寄存器R4中内容的符号位。
2.6 MIPS指令集结构 (3) 域的下标:表明从该域中选择某一位。 域中位的标记是从最高位开始标记,并且起始标记为0。 下标可以是一个单独的数字。 如 Regs[R4]0 :选择寄存器R4中内容的符号位。 下标也可以是一个范围。 如 Regs[R3] :选择寄存器R3中内容的最低一个字节。 (4)域的上标:表示复制一个域。 如 024可以得到一个24位全为0的一个域。 (未完接下页)
68
(5) 变量Mem:表示存储器中的一个数组,存储器按照字节寻址,可以传输任意个字节,传输的字节个数视指令而定。
2.6 MIPS指令集结构 (5) 变量Mem:表示存储器中的一个数组,存储器按照字节寻址,可以传输任意个字节,传输的字节个数视指令而定。 举例:R8、R10:64位的寄存器,则 Regs[R8] ←32 (Mem [Regs[R6]]0)24 ## Mem [Regs[R6]]表示的意义是: 以R6的内容作为地址访问内存,得到的字节按符 号位扩展为32位后存入R8的低32位,R8的高32位 (即Regs[R8]0..31)不变。 3. Load/Store指令
69
指令举例 指令名称 含 义 LD R2,20(R3) 装入双字 Regs[R2]←64 Mem[20+Regs[R3]]
LW R2,40(R3) 高32位装符号, 低32位装入字 Regs[R2]←64 (Mem[40+Regs[R3]]0)32 ## Mem[40+Regs[R3]] LB R2,30(R3) 高56位装符号, 低8位装入字节 Regs[R2]←64 (Mem[30+Regs[R3]]0)56 ## Mem[30+Regs[R3]] LBU R2,40(R3) 装入无符号字节 Regs[R2]← ## Mem[40+Regs[R3]] LH R2,30(R3) 高48位装符号,低16位装入2个字节的半字 Regs[R2]←64 (Mem[30+Regs[R3]]0)48 ## Mem[30+Regs[R3]] L.S F2,60(R4) 装入单精度浮点数低32位为全0 Regs[F2]←64 Mem[60+Regs[R4]] ## 032 L.D F2,40(R3) 装入双精度浮点数 Regs[F2]←64 Mem[40+Regs[R3]] SD R4,300(R5) 保存双字 Mem[300+Regs[R5]]←64 Regs[R4] SW R4,300(R5) 保存单字 Mem[300+Regs[R5]]←32 Regs[R4] S.S F2,40(R2) 保存单精度浮点数 Mem[40+Regs[R2]]←32 Regs[F2] 0··31 SH R5,502(R4) 保存半字 Mem[502+Regs[R4]]←16 Regs[R5] 48··.63
70
Imm字段为16位,即4 ALU指令 寄存器-寄存器型(RR型)或立即数型(RI型) 算术和逻辑操作:加、减、与、或、异或和移位等
寄存器比较指令(,,,,,) MIPS结构中有一个32位立即数寄存器IR,Imm字段的16位要经过符号位扩展才能存入IR,即 IR ← (Imm16)16 ## Imm 指令举例 指令名称 含义 DADDU R1,R2,R3 无符号加 Regs[R1]← Regs[R2]+ Regs[R3] DADDIU R4,R5,#6 加无符号立即数 Regs[R4]← Regs[R5]+6 LUI R1,#4 把立即数装入到一个字的高16位 Regs[R1]← 032 ## 4 ## 016 Imm字段为16位,即4 DSLL R1,R2,#5 逻辑左移 Regs[R1]← Regs[R2]<<5 DSLT R1,R2,R3 置小于 If(Regs[R2]< Regs[R3]) Regs[R1]← 1 else Regs[R1]←0
71
R0的值永远是0,它可以用来合成一些常用的操作。 例如:
2.6 MIPS指令集结构 R0的值永远是0,它可以用来合成一些常用的操作。 例如: DADDIU R1,R0,#100 //给寄存器R1装入常数100 DADD R1,R0,R2 //把寄存器R2中的数据传送到寄存器R1
72
2.6.6 MIPS的控制指令 name=offset<<2 16(26)位->18(28)位
指令举例 指令名称 含义 J name 跳转 PC 36··63← name JAL name 跳转并链接 Regs[R31]←PC+4;PC 36··63←name; ((PC+4)-227)≤name<((PC+4)+227) JALR R3 寄存器跳转并链接 Regs[R31]←PC+4;PC← Regs[R3] JR R5 寄存器跳转 PC← Regs[R5] BEQZ R4,name 等于零时分支 if(Regs[R4]== 0) PC←name; ((PC+4)-217)≤name<((PC+4)+217) BNE R3,R4,name 不相等时分支 if(Regs[R3]!= Regs[R4]) PC←name MOVZ R1,R2,R3 等于零时移动 if(Regs[R3]==0) Regs[R1]← Regs[R2]
73
根据跳转指令确定目标地址的方式不同,可以把跳转分成两种:
2.6 MIPS指令集结构 1. 跳转指令 根据跳转指令确定目标地址的方式不同,可以把跳转分成两种: J and JAL,由J类指令中的偏移量和当前PC值计算转移目标地址,即把指令中的26位偏移量左移2位后,替换64位程序计数器的低28位 因为指令字长都是4个字节,原始地址的低2位永远为0,无须在指令中占位 JR and JALR,由指令中指定一个寄存器来给出转移目标地址。 根据跳转指令执行时是否链接,可以把跳转分成两种 J and JR 简单跳转:把目标地址送入程序计数器。 JAL and JALR 跳转并链接:把目标地址送入程序计数器,把返回地址(即顺序下一条指令的地址)放入寄存器R31。
74
提供一组比较指令,用于比较两个寄存器的值。
2.6 MIPS指令集结构 2. 分支指令(条件分支指令,条件转移指令) 分支条件由指令确定。 例如:测试某个寄存器的值是否为零 提供一组比较指令,用于比较两个寄存器的值。 例如:“置小于”指令 有的分支指令可以直接判断寄存器内容是否为负,或者比较两个寄存器是否相等。 分支的目标地址。 由I类指令中的立即数和当前PC值计算分支目标地址,即把指令中的16位带符号立即数左移2位后,替换64位程序计数器的低18位。与跳转相比,分支指令转移范围小得多16v.s.26位 除了以上列出的分支指令,MIPS还有一条浮点条件分支指令:通过测试浮点状态寄存器来决定是否进行分支。
75
2.6.7 MIPS的浮点操作 由操作码指出操作数是单精度(SP)或双精度(DP) 后缀S:表示操作数是单精度浮点数
包括加、减、乘、除,分别有单精度和双精度指令。 浮点数比较指令 根据比较结果设置浮点状态寄存器中的某一位,以便于后面的分支指令BC1T(若真则分支)或BC1F(若假则分支)测试该位,以决定是否进行分支。
Similar presentations