参考资料:《计算机组成原理》(秦磊华版)
目录
- 一 基本概念
- 二 指令格式
- (一)操作码字段
- (二)操作数地址码字段
- (三)关于指令长度的有关概念
- 三 寻址方式
- 四 指令系统类型
- 五 指令格式的设计及优化
- 六 CISC和RISC的基本概念
- (一)复杂指令系统计算机(CISC)
- (二)精简指令系统计算机(RISC)
- 七 MIPS指令系统
- (一) MIPS 中的寄存器
- (二)MIPS 的指令格式
- (三)MIPS 指令的寻址方式
一 基本概念
- 指令:计算机中有 一股控制信息,它使得计算机按人们预先编好的程序去工作 , 这些控制信息就是控制计算机执行某种操作(如加、减、传送、转移等操作)的命令,称为指令。指令通常应该提供的信息包括指令所做的操作、操作数据的来源、操作结果的存放位置等信息 。
- 指令系统:一台计算机中所有指令的集合称为该计算机的指令系统。
- 高级语言指令、汇编语言指令、机器语言指令和微指令的关系:一 条高级语言指令被“翻译”(编译或解释)成多条机器语言指令,一条汇编语言级指令(不包含宏指令)往往被“翻译”(汇编)成一条机器指令,一条机器指令功能的实现依赖于多条微指令的执行。
- 指令系统的特性:
- 完备性:编程时指令系统直接提供的指令足够使用,而不必用软件实现,即要求所设计的指令系统种类齐全、使用方便 。
- 有效性:利用指令编写的程序能高效率地运行,程序占用的存储资源少 。
- 规整性:指令系统的对称性(指令平等对待各种寻址方式)、指令系统的均齐性(指令平等对待各种数据类型)、指令格式与数据格式的一致性
- 兼容性:某机器上运行的软件无须或少量修改就可以在另 一 台计算机上正确运行。
- 指令的格式:一条指令由操作码字段和操作数地址码字段组成。
- 指令长度:一条指令中所包含对的二进制位数。
- 机器字长:计算机能直接处理的二进制数据的位数。
- 寻址方式:根据存储程序的概念,计算机在运行程序之前必须把指令和数据(或称操作数)存放在主存储器相应地址单元中,运行程序时,不断地从主存中取指令和数据,由于主存是基于地址访问的存储器,只有获得指令和操作数在主存中的地址(称为有效地址)后, CPU 才能访问所需要的指令和数据,而寻址方式就是寻找指令或操作数有效地址的方法 。
- 指令助记符:由于硬件只能识别 1 和 0,所以采用二进制操作码是必要的,但是我们用二进制来书写程序却非常麻烦,为了便于书写和阅读程序,每条指令通常用 3 个或 4 个英文缩写字母来表示,这种缩写码叫做指令助记符,不同的计算机系统,规定不一样,常见的有 ADD、SUB、MOV、JMP、STR、LDA。
二 指令格式
(一)操作码字段
指令中用于控制指令操作性质的字段称为操作码,不同功能的指令其操作码编码不同,如可用 0001 表示加法操作,0010 表示减法操作。
- 固定长度操作码:操作码的长度固定,而且操作码在指令中的位置也固定在指令的一个字段中,通常情况下 ,长度为 n 位的操作码,最多可表示为 2n 条指令。
- 可变长度操作码:操作码的长度可变,而且操作码的位置也不固定,可通过以下两种方法实现:
- 采用 Huffman 编码,使用频度高的指令使用短的操作码,使用频度低的指令使用长编码。
- 采用扩展操作码,通过将操作码向不用的地址码字段扩展来实现。
(二)操作数地址码字段
指令中用于参与指令操作的操作数的地址或偏移量地址的字段。
- 三地址地址码:双目运算指令的第一操作数地址 + 第二操作数地址 + 操作结果地址
- 双地址地址码:双目运算指令的第一操作数地址(目的地址) + 第二操作数地址(源地址),操作结果存放在第一操作数地址,根据所指向的数据存储位置不同分为以下三种类型:
- RR(寄存器-寄存器)型
- RS(寄存器-存储器)型
- SS(存储器-存储器)型
- 单地址地址码:单目运算指令的操作数地址(操作结果也存放在该地址)或双目运算指令的其中一个操作数地址(另一个操作数地址和操作结果隐含于CPU中的某个寄存器,通常是累加器)
- 零地址地址码:无需任何操作数的指令、操作数隐含于CPU某个寄存器(通常是累加器)中的单目运算指令或两个操作数均由堆栈提供且操作结果也存放在堆栈的双目运算指令
(三)关于指令长度的有关概念
- 半字长指令:指令字长对于半个机器指令字长(主存一个存储单元存放两条指令,CPU 访问主存时一次读出两条指令 )
- 单字长指令:指令字长对于一个机器指令字长(主存一个存储单元存放一条指令,CPU 访问主存时一次读出一条指令 )
- 多字长指令:指令字长对于多个机器指令字长(主存多个存储单元存放一条指令,CPU 访问主存时多次读出一条指令 )
三 寻址方式
(一)指令的寻址方式
- 顺序寻址方式:程序中的指令序列在主存中往往顺序存放,大多数情况下,程序又是按照指令系列顺序执行,因此,如果知道第 一条指令的有效地址,通过增加一条指令所占用主存单元的数最,就很容易知道下 一 条指令的有效地址,这种计算指令有效地址的方法称为指令的顺序寻址方式。CPU 用程序计数器 PC 保存指令址,只要将程序首地址送PC,然后每执行一条指令,通过 PC 加 1,便能算出下一条指令地址,直到程序结束,需要特别说明的是 PC+ 1 中的 “1" ,这里的 “1”(以字节为单位)是指 一 条指令所占用的存储单元数 。
- 跳跃寻址方式:当程序中出现分支或转移时,就会改变程序的执行顺序,此时,指令寻址就要采取跳跃寻址方式 ,所谓跳跃,就是指下条指令的地址不一定通过程序计数器 PC 加 1 获得,最终的地址由指令本身及指令需要测试的条件决定,指令系统中的无条件转移指令和各种条件转移指令,就是为跳跃寻址方式而设置的 。
(二)操作数的寻址方式
操作数来源基本上有 3 种情况:①操作数直接来自指令地址字段。②操作数存放在寄存器中 ,即寄存器操作数。③操作数存放在存储器中,即存储器操作数。
-
立即寻址:指令的地址码字段(形式地址或偏移量)指出的不是操作数的地址而是操作数本身,一般用于给变量赋初值。
- 优点:指令执行速度快。
- 缺点:表示的操作数范围受限制。
-
直接寻址:形式地址给出操作数的有效地址。
- 优点:地址直观,不需要通过计算可直接从指令中获得操作数的有效地址。
- 缺点:寻址范围受限于指令中直接地址的二进制位数;数据的地址存在于指令中,程序和数据在内存中的存放位置受到限制,灵活性不够; 当数据的地址改变时,需要修改指令中的形式地址字段的值,编程不方便 。
-
间接寻址:地址码字段中的形式地址给出的不是操作数的有效地址,而是操作数地址的地址(也称操作数地址指示器),也就是说,形式地址字段所指示单元中的内容才是操作数的有效地址,而形式地址只是一个间接地址。
- 优点:解决直接寻址方式下寻址范围受限的不足,可以用较短的地址码访问较大的主存空间;相对于直接寻址而言编程灵活,当操作数地址改变时,不再需要改变指令中的形式地址字段,只需要修改地址指示字所指主存单元的内容即可。
- 缺点:取操作数需两次访问内存,降低了指令的执行速度。
-
寄存器寻址:取操作数不需要访问主存,形式地址字段不表示主存地址,而表示通用寄存器号, 操作数存放在 CPU 内的通用寄存器中。
- 优点:获得操作数不需要访问主存,指令执行速度快;所需要的地址码短,有利于缩短指令字的长度,节省存储空间。
- 缺点:CPU 中的寄存器数量有限,不能为操作数提高大量的存储空间。
-
寄存器间接寻址:操作数的地址存放在寄存器中,指令的形式地址字段给出的是存放操作数地址的寄存器号,以寄存器的内容为有效地址访问主存单元,即可得到所需的操作数。
- 优点:解决间接寻址需要访问主存两次才能获得操作数的不足,因为操作数地址存放在寄存器中,指令访问操作数时,只需要访问一次内存,比间接寻址少访问一次。 (既能扩展寻址范围,又不增加访问主存的次数。)
-
相对寻址:把程序计数器 PC 中的内容加上指令中的形式地址,形成操作数的有效地址。
- 优点:编程只要确定程序内部操作数与指令之间的相对距离,而无须确定操作数在主存中的绝对地址,便于实现程序浮动。
-
变址寻址:用一个寄存器存放变化的地址,这个寄存器称为变址寄存器,用指令的形式地址字段存放一个偏移值,变址寄存器的内容与指令中形式地址之和即为操作数据的有效地址。习惯上变址寻址中变址寄存器提供修改量而指令提供基准量,因此变址寄存器中的内容可变,而指令形式地址中的内容一经设定,在指令执行过程中不变。
-
基址寻址:用一个寄存器存放基地址,这个寄存器称为基址寄存器,同时用指令的形式地址字段存放变化的地址值,基址寄存器的内容与形式地址之和即为操作数的有效地址。习惯上基址寻址中基址寄存器提供基准量而指令提供位移量,因此指令形式地址字段中的内容可变,而基址寄存器中的值一经设定,在指令执行过程中不再改变。
-
堆栈寻址:堆栈以先进后出的方式存储数据,寻找存放在堆栈中操作数地址的方法称堆栈寻址。
- 存储器堆栈:在内存空间开辟堆栈区,进行堆栈操作时,堆栈栈顶随着堆栈操作而移动,而堆栈中的数据不动。
- 寄存器堆栈:利用寄存器作为堆栈区,进行堆栈操作时,堆栈栈顶固定不动,而堆栈中的数据会移动。
-
复合寻址:几种寻址方式的组合,主要应用于复杂指令集结构计算机中。
- 变址寻址+间接寻址
- 间接寻址 + 变址寻址
- 相对寻址+ 间接寻址
-
段寻址方式
-
分页寻址方式
需注意的是,对多地址指令而言,由于不同的地址所起的作用不同,因此每个地址字段都应该有各自的寻址方式。
四 指令系统类型
- 数据传送指令:计算机中最基本、最常用的指令,主要用于两个部件之间的数据传送操作,在执行数据传送指 令时,数据从源地址传送到目的地址,源地址中的数据不变。
- 算术逻辑运算指令:CPU 最基本功能的体现,主要功能是进行各类数据信息处理,包括各种算术运算及逻辑运算指令,其中,算术运算指令主要包括二进制的定点、浮点数加、减、乘、除运算指令;求反、求补、加1、减 1 、比较指令;十进制加减运算指令等 ,而逻辑运算指令主要包括与、或、非、异或、测试等指令,多用于对数据字中某些位(一位或多位)进行操作,也可以用于进行数据的相符判断和数据修改 。
- 移位操作指令:分为算术移位、逻辑移位和循环移位,可以实现对操作数左移或右移一位或几位。
- 算术移位:实现带符号数的移位,常用于对操作数乘以 2 或除以 2 的运算。
- 逻辑移位:实现无符号数的移位。
- 循环移位:按是否与进位位一起循环分为带进位循环(大循环)和不带进位循环(小循环)。
- 堆栈操作指令:一种特殊的数据传送指令,主要用于保存和恢复中断、子程序调用时的现场数据和断点指令地址, 以及在子程序调用时实现参数传递。
- 压入(进栈)指令:把指定的操作数送入栈顶。
- 弹出(出栈)指令:从栈顶弹出数据,送到指令指定的目的地址中。
- 字符串操作指令:属于非数值处理指令,便于直接用硬件支持非数值处理。
- 字符串传送指令:用于将数据块从主存的某一区域传送到另一区域。
- 字符串比较指令:用于把一个字符与另一个字符串逐个字符进行比较。
- 字符串查找指令:用于在一个字符串中查找指定的子串或字符。
- 字符串抽取指令:用于在字符串中提取某一子串。
- 字符串转换指令:用于将字符串从一种编码转换为另一种编码。
- 程序控制指令:用于控制程序运行的顺序和选择程序的运行方向,该类指令能增加程序设计的灵活性,可使程序具有测试、分析与判断能力。
- 转移指令:用于根据功能的需要,改变指令的执行顺序流程,按其转移是否需要测试相应条件可分为无条件转移指令和条件转移指令两类,转移指令的转移地址一般采用相对寻址或直接寻址。
- 循环控制指令:实际上是一种增强型的条件转移指令,其指令功能 一 般包括对循环控制变量的修改、测试判断以及地址转移等功能,从而支持循环程序的执行。
- 子程序调用与返回指令:在编写程序时,为了避免程序的重复编写,将具有特定功能的程序段设定为独立且可以公用的子程序。在主程序执行过程中,当需要执行子程序时,在主程序中发出调用子程序的指令(转子指令)并给出子程序的入口地址,控制程序的执行序列从主程序转入子程序;而当子程序执行完毕后,可以利用返回主程序的指令(返回指令),使程序重新返回主程序中发出子程序调用命令的地方,继续顺序执行。
- 陷阱指令:陷阱实际是指由于意外事故而导致的程序执行中断,在程序的执行过程中,一旦出现意外故障,计算机就发出陷阱信号,暂停当前程序的执行,通知 CPU 当前所出现的故障,并转入故障处理程序,进行相应的故障处理。
- 输入输出指令:简称 I/O 指令,用于主机与外部之间的数据输入输出、主机向外设发出各种控制命令控制外设的工作、主机读入和测试外设的各种工作状态等。
- 其他指令:一 些完成其他控制功能的指 令,如停机、等待、空操作、开中断、关中断、置条件码以及特权指令等,其中,特权指令主要用于系统资源的分配与管理,具有特殊的权限,一般只能用于操作系统或其他系统软件,而不直接提供用户使用,在多任务多用户的计算机系统中,这种特权指令是不可缺少的 。
五 指令格式的设计及优化
(一)指令格式的设计
- 指令编码格式对的设计:确定的是指令的编码格式,确定指令是采用定长指令结构、变长指令结构还是混合结构。需注意的是,由于指令和数据都存放在主存中,所以不论是设计定长指令结构、变长指令结构还是混合编码指令格式,都应该满足指令的规整性要求,使指令与数据格式保待一致,通常情况下,指令长度设计为字节的倍数关系,在按字节编址的存储器中,采用长度为字节整数倍的指令,有利千充分利用存储空间 。
- 定长指令格式:结构规整,各种类型指令长度都相等。
- 变字长指令格式:各种指令字的长度随指令功能的不同而不同。
- 混合编码指令格式:是定长指令格式和变字长指令结构的综合,提供若干长度固定的指令字,以期达到既能减少目标代码的长度又能降低译码复杂度的目标。
- 操作码的设计:满足完备性是操作码设计的基本要求,操作码设计任务还包括确定操作码采用定长结构还是可变长的操作码,对于变长操作码结构还要研究其实现方法 。
- 地址码的设计:地址码一方面要能为指令提供必要的操作数,另一方面还要满足指令系统的有效性和规整性要求,地址码的设计往往还与寻址方式有关 。
- 寻址方式的设计:寻址方式的表示有两种方法,一种是把寻址方式与操作码一起编码,另一种是设置专门的寻址方式字段指示对应的操作数所采用的寻址方式。如果处理机需要支持多种寻址方式,而且指令有多个操作数,那么就很难将寻址方式与操作码一起编码,此时应该为每个操作数据分配一个寻址方式字段。
(二)指令格式的优化
- 操作码优化表示:指令格式优化设计的主要目标有两个,一是节省程序的存储空间, 二是指令格式要尽量规整,以减少硬件译码的复杂程度 ,另外,指令格式优化后,不应该降低指令的执行速度。
- Huffman 编码法
- 基于扩展编码的操作码优化
- 基于扩展地址码的操作优化:通常在指令中用一个固定长度的操作码字段对基本的指令进行编码,而对于一部分不需要某个地址字段的指令,可将操作码扩展到该地址码字段,这样既能充分利用指令的各个字段,又能在不增加指令长度的情况下扩展操作码的长度,从而表示更多的指令 。
- 地址码优化表示:地址码优化的根本目的是缩短地址码的长度,并能用一个较短的地址码表示一个比较大的逻辑地址空间,这样既能满足寻址的要求,又不增加指令的长度。
- 用间接寻址方式缩短地址码长度。
- 用偏移寻址方式缩短地址码长度。
- 用寄存器间接寻址方式缩短地址码长度。
六 CISC和RISC的基本概念
复杂指令集计算机(Complex Instruction Set Computer,CISC)和精简指令集计算机(Reduced Instruction Set Computer,RISC)是 CPU 的两种架构,它们的区别在于不同的 CPU 设计理念和方法。
(一)复杂指令系统计算机(CISC)
随着 VLSI 技术的不断发展,计算机的硬件成本不断下降,但软件成本不断提高,为此,计算机系统设计者在设计指令系统时,增加了越来越多且功能更强大的复杂指令,以及多种寻址方式,以便满足来自不同方面的需求,如:
-
更好地支持高级语言:增加语义更接近高级语言语句的指令,能缩短指令系统与高级语言之间的语义差距。
-
简化编译:编译器是将高级语言翻译成机器语言的软件,当指令的语义与高级语言的语义接近时,编译器的设计就相对简单,编译的效率也会大大提高,而且编译后的目标程序也能得到优化。
-
系列机软件向后兼容的需求:为了做到程序兼容,同一系列计算机的新型计算机和高档机的指令系统只能扩充而不能减少原来的指令,因此指令数量越来越多。
-
对操作系统的支持:随着操作系统功能的复杂,要求指令系统提供相应功能指令的支持,如多媒体指令和 3D 指令等。
-
为在有限指令长度内基于扩展法实现更多指令,只有最大限度地压缩地址长度:为满足寻址访问的需要,必须设计多种寻址方式,如基址寻址、相对寻址等。
基于上述原因,指令系统越来越庞大、复杂,某些计算机的指令多达数百条,同时寻址方式的种类也很多,称这类计算机为复杂指令系统计算机。
CISC 具有如下特点:
- 指令系统复杂庞大,指令数目一般多达二三百条。
- 寻址方式多。
- 指令格式多。
- 指令字长不固定。
- 访存指令不加限制。
- 各种指令使用频率相差大。
- 各种指令执行时间相差大。
- 大多数采用微程序控制器。
(二)精简指令系统计算机(RISC)
人们进一步分析 CISC 后发现了 80-20 规律,即 CISC 的典型程序中,80% 程序只用到了 20% 的指令集,基于这一发现,RISC 精简指令集被提出来,这是计算机系统架构的一次深刻革命。
RISC 体系结构的基本思路是:针对 CISC 指令系统指令种类太多、指令格式不规范、寻址方式太多的缺点,通过减少指令种类、规范指令格式和简化寻址方式,方便处理器内部的并行处理,从而大幅度地提高处理器的性能。
RISC 是在继承 CISC 的成功技术并克服 CISC 缺点的基础上产生并发展起来的,大部分 RISC 具有下述一些特点:
-
优先选取使用频率最高的一些简单指令,以及一些很有用但不复杂的指令,避免使用复杂指令。
-
大多数指令在一个机器周期内完成。
-
采用 LOAD/STORE 结构:由于访问主存指令花费时间较长,因此在指令系统中应尽量减少访问主存指令,而只保留不能再减掉的 LOAD(取数) 和 STORE(存数) 两种访存指令,也就是说其余指令只对存放在寄存器中的操作数进行处理。
-
采用简单的指令格式和寻址方式,指令长度固定。
-
固定的指令格式:指令长度、格式固定,可简化指令的译码逻辑,有利于提高流水线的执行效率。
-
面向寄存器的结构:为减少访问主存储器,CPU 内应设大量的通用寄存器。
-
采用硬布线控制逻辑:由于指令系统的精简,控制部件可由组合逻辑实现,不用或少用微程序控制,这样可使控制部件的速度大大提高。
-
注重编译的优化,力求有效地支撑高级语言程序。
精简指令系统计算机的着眼点不是简单地放在简化指令系统上,而是通过简化指令使计算机的结构更加简单合理,从而提高处理速度,其主要途径是减少指令的执行周期数。现在,RISC 的硬件结构有很大改进,一个机器周期平均可完成 1 条以上指令,甚至可达到几条指令。
七 MIPS指令系统
MIPS CPU是一种 RISC 结构的 CPU,目前 MIPS CPU 有 32 位和 64 位两种,下面以 MIPS 32 为例对 MIPS 指令系统进行简要介绍。
(一) MIPS 中的寄存器
MIPS 提供了 32 个 32 位的通用寄存器,各寄存器的编号、名称和功能如下所示:
除上述通用寄存器外,MIPS 还提供 32 个 32 位单精度浮点寄存器,用符号 f0 ~ f31 表示,它们可以配对成 16 个 64 位的浮点数寄存器。
另外,MIPS 还提供了两个 32 位乘商寄存器 Hi 和 Lo,执行乘法时,Hi 和 Lo 分别存放 64 位乘积的高 32 位和低 32 位,执行除法时,Hi 和 Lo 分别存放余数和商。
(二)MIPS 的指令格式
MIPS 将寻址方式与指令的操作码相关联,因此不再独立设置寻址方式特征位字段,所有指令都是 32 位,分成 R 型、I 型和 J 型等 3 种指令类型,其结构如下所示:
从上图可看出:
- MIPS 指令采用等长指令结构,3 种类型指令都是 32 位。
- 没有寻址方式字段。
- 操作码字段长度固定为 6 位。
1 R 型指令
R 型指令的操作数只能来自寄存器,运算结果也只能存入寄存器中,属于 RR 型指令。R 型指令的 OP 字段为 000000,具体的操作由 funct 字段指定,该字段的编码与具体 R 型运算的关系如下所示:
若是双目运算,rs 和 rt 字段分别是第一和第二源操作数,rd 字段指明存放结果的寄存器,若是移位运算,则表示对 rt 的内容进行移位,所移位数由 shamt 字段指定。
2 I 型指令
I 型指令是立即数型指令:
- 若是双目运算,则将 rs 的内容和立即数字段的值分别作为第一操作数和第二操作数,结果送往 rt 指定的寄存器中。
- 若是 Load/Store 指令,则将 rs 的内容和立即数字段的值经符号扩展后的内容相加作为读/写(Load/Store)的存储单元地址。
- 若是条件转移(分支)指令,则对 rs 和 rt 寄存器中的数据进行操作码规定的运算,并根据运算的结果决定是否转移。当转移发生时,转移的目标地址采用相对寻址方式获得,即将 PC 的内容和立即数字段经符号扩展后的内容相加得到。
3 J 型指令
J 型指令主要是无条件转移指令,指令中给出的是 26 位直接地址,无条件转移的目标地址由 PC 高 4 位与 26 位直接地址经左移两位后的值拼接而得到。
(三)MIPS 指令的寻址方式
MIPS 指令有如下几种寻址方式:
- 寄存器寻址。
- 基址或偏移寻址:操作数在主存,且有效地址是某寄存器与指令中某常量之和。
- 立即数寻址。
- PC 相对寻址:地址是 PC 与指令中常量之和。
- 伪直接寻址:跳转指令由指令中 26 位与 PC 高位拼接而成。
具体到 MIPS 的 3 种指令格式,其中 R 型指令的寻址方式只有寄存器寻址,I 型指令的寻址方式有立即数寻址、基址(偏移寻址)、相对寻址、寄存器寻址,J 型指令只有一种寻址方式,就是伪直接寻址。