1 概述
指令
含义
指示计算机执行某种操作的命令
指令系统
含义
一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。
注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指
完善的指令系统满足的要求
完备性
指令系统应该包含所有必要的操作,以便计算机可以执行各种各样的任务。这包括数据操作(如加载、存储、算术和逻辑操作)、控制操作(如跳转和分支)以及特殊操作(如中断和系统调用)。
规整性
指令系统的设计应该尽可能简单和一致。例如,所有的指令应该有相同或相似的格式,所有的地址都应该以相同的方式指定,等等。
有效性
指令系统应该能够高效地执行。这意味着指令的执行时间应该尽可能短,而且指令的数量也应该尽可能少。
兼容性
新的指令系统应该与旧的指令系统兼容,以便旧的软件可以在新的硬件上运行。
可扩展性
指令系统应该设计得足够灵活,以便可以容易地添加新的指令或修改现有的指令。
2 指令格式
含义
指令字用二进制代码表示的结构形式
组成
①操作码
含义
决定了计算机应该执行什么操作。操作码可以是算术操作(如加、减、乘、除)、逻辑操作(如与、或、非)、数据移动操作(如加载、存储)、控制操作(如跳转、分支)等。
分类
定长操作码
含义
长度固定,位置固定。
特点
控制简单,速度快,适用于指令条数不多的场合。
缺点是指令系统的扩展性较差,因为每增加一条新指令,都可能需要改变现有的指令格式。
变长操作码
含义
长度可变,位置也不固定。
特点
优点是指令系统的扩展性较好,因为可以根据需要增加新的指令,而不需要改变现有的指令格式。
缺点是控制复杂,速度较慢,因为需要在运行时解析指令的格式。
②地址码
含义
地址码是指令的一部分,它指定了参与操作的操作数的地址。地址码可以是直接地址、间接地址、寄存器地址、立即数等。
分类
零地址指令
1.不需要操作数,如空操作、停机、关中断等指令
2.堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶
一地址指令
只需要单操作数
这个操作数可以是一个寄存器,也可以是一个内存地址。
一地址指令通常用于单操作数的操作,如取反、逻辑非等。
二地址指令
需要两个操作数。
这两个操作数可以是两个寄存器,也可以是一个寄存器和一个内存地址,或者是两个内存地址。
二地址指令通常用于双操作数的操作,如加法、减法、乘法、除法等。
3 寻址方式
含义
当采用地址指定方式时,形成操作数或指令地址的方式。如何确定下一条指令的存放地址?由程序计数器PC指明
①指令寻址方式
含义
确定下一条欲执行指令的指令地址
分类
顺序寻址方式
最基本的寻址方式,它按照程序中的指令顺序执行。在每次执行指令后,程序计数器(PC)会自动加1,指向下一条指令的地址。这种寻址方式简单且直观,但它不适用于需要条件判断或循环的情况。
跳跃寻址方式
允许程序跳过一些指令,直接跳到指定的地址执行。跳跃地址通常由指令本身给出,或者由某些条件决定。这种寻址方式使得程序可以实现条件判断和循环等复杂的控制结构。
②操作数寻址方式
含义
确定本条指令的操作数地址
分类
1.立即
含义
地址码部分的形式地址 A就是操作数D,而不是操作数的地址
特点
执行:取指令访存1次,执行指令访存0次
优点:执行指令阶段不访问主存,执行指令时间最短
缺点:A的位数限制了立即寻址的范围。如A的位数为n,且立即数采用补码时,可表示-2n-1~2n-1-1
2.直接
含义
在指令格式的形式地址 A 中直接指出操作数的有效地址EA。由于操作数地址直接给出而不需要变换,称为直接寻址方式。
特点
执行:取指令访存1次、执行指令访存1次,暂不考虑存结果,共访存2次
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。
缺点:A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改
3.寄存器
当操作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式。此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号。
4.间接
含义
相对于直接寻址而言,形式地址D给出的不是操作数的有效地址,而是操作数的间接地址。
特点
执行:取指令访存1次,执行指令访存2次,暂不考虑存结果,共访存3次
优点:可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。便于编制程序(用间接寻址可以方便地完成子程序返回)。
缺点:指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需根据存储字的最高位确定几次访存)。
5.寄存器间接
指令中的操作数地址指示出的寄存器中内容不是操作数,而是操作数的有效地址EA。
允许我们在寄存器中存储操作数的地址,而不是操作数本身。
6.相对
把程序计数器PC的内容加上形式地址A形成操作数的有效地址
在处理跳转和分支指令时非常有用,因为它允许我们根据当前的程序位置来确定操作数的地址。
7. 变址
与基址寻址方式计算有效地址的方法十分相似,它把CPU中某个变址寄存器的内容与形式地址A相加来形成操作数有效地址。
这种方式在处理数组和循环时非常有用,因为它允许我们动态地改变操作数的地址。
8.基址
将CPU中基址寄存器的内容加上指令格式中的形式地址A而形成操作数的有效地址EA。
这种方式在处理多任务和动态内存分配时非常有用,因为它允许我们在不同的内存区域中动态地定位操作数。
9.堆栈
用于寻找存放在堆栈中的操作数地址。在执行函数调用和返回时,堆栈寻址是非常有用的,因为它允许我们保存和恢复程序的状态。
4 指令类型
①算术逻辑运算指令
用于对数据进行逻辑操作,包括逻辑与AND、逻辑或OR、逻辑非NOT等三种基本操作以及同或、异或等组合逻辑操作。
②移位操作指令
是一组经常使用的指令,属于汇编语言逻辑指令中的一部分,它包括移位指令(含算术移位指令、逻辑移位指令),循环移位指令(含带进位的循环移位指令),双精度移位指令三大类。
③数据传送指令
是将数据、地址或立即数传送到寄存器或存储单元中,或将源操作数的内容或地址传送给目的操作数。常见的数据传送指令有MOV、XCHG、XLAT等。
④堆栈操作指令
分为“入栈”和“出栈”两种,入栈操作通过push指令将数据放入堆栈,而出栈操作通过pop指令将数据从堆栈中取出。
⑤字符串处理指令
是一种非数值处理指令,一般包括字符串传送、字符串转换(把一种编码的字符串转换成另一种编码的字符串)、字符串替换(把某一字符串用另一字符串替换)等。
⑥程序控制指令
对于编写复杂的计算机程序至关重要,它们使程序能够根据不同的情况和要求执行不同的操作,从而实现所需的功能和逻辑。
⑦输入输出指令
用来完成I/O端口与累加器之间的数据传送,指令中给出I/O端口的地址值。当执行输入指令时,把指定端口中的数据读入累加器中;当执行输出指令时,则把累加器中的数据写入指定的端口中。
⑧其他指令
包括了一些特殊的命令,比如在Linux中的一些命令行指令,或者在某些特定的应用程序中使用的特定指令等。
5 指令格式设计
①指令编码格式的设计
定长指令格式
在这种格式中,所有指令的长度都是相同的。操作码字段的位数和位置固定,为能够表示整个指令系统中的全部指令,指令的操作码字段应当具有足够的位数。设指令系统共有m条指令,指令中操作码字段的位数为N位,则满足 m<=2。
变长指令格式
在这种格式中,各种指令的长度随指令功能的不同而不同。
混合编码指令格式
混合编码指令格式是定长指令格式和变长指令结构的综合,它提供若干长度固定的指令字,以期达到既能减少目标代码的长度又能降低译码复杂度的目标。
②操作码的设计
操作码字段表征指令的操作特性与功能,是指令的唯一标识。不同的指令操作码不能相同。
操作码可以分为固定长度的代码和可变长度的代码。固定长度的代码中,所有指令操作码的长度相等。可变长度的代码可以减小操作码的平均长度,提高指令编码的效率。
对使用频率较高的指令,分配较短的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。
③地址码的设计
地址码字段指定参与操作的操作数的地址码。地址码中可以包含存储器地址,也可包含寄存器编号。
指令中可以有一个、两个或者三个操作数,也可没有操作数,根据一条指令有几个操作数地址,可将指令分为零地址指令、一地址指令、二地址指令、三地址指令。
地址码的设计应当与操作码的设计相匹配,以形成高效合理的指令编码。
④寻址方式的设计
寻址方式决定了如何获取操作数。主要有面向主存、寄存器、堆栈等寻址方式。
两种指明方式:用操作码中的某些位、用地址码的某些位。
寻址方式的选择直接影响到系统的容量、抗干扰能力、接入和切换速度等性能。
6 CISC 和 RISC
复杂指令系统计算机CICS
CISC (Complex Instruction Set Computer) 的设计策略是使用大量的指令,包括复杂指令。在CISC中进行程序设计要比在其他设计中容易,因为每一项简单或复杂的任务都有一条对应的指令。CISC的指令能力强,但单多数指令使用率低却增加了CPU的复杂度,指令是可变长格式。CISC包括一个丰富的微指令集,这些微指令简化了在处理器上运行的程序的创建。
精简指令系统计算机RISC
RISC (Reduced Instruction Set Computer) 的基本思想是通过简化指令集来提高CPU的执行速度和效率。RISC架构的指令集通常包含了一些简单的指令,这些指令的执行速度很快,但是功能比较单一。RISC的指令大部分为单周期指令,指令长度固定,操作寄存器,只有Load/Store操作内存。
这两种架构各有优势,而且界限并不那么明显。现代的CPU往往采用CISC的外围,内部加入了RISC的特性。下一代的CPU将融合CISC与RISC两种技术,从软件与硬件方面看二者会取长补短。
7 指令系统举例
PDP-11指令系统
PDP-11是迪吉多电脑在1970到1980年代销售的一系列16位迷你电脑。PDP-11深受程序员喜爱的原因,主要是在于其高度正规化指令集的设计,使得程序员可以容易地分别记住所有的运算码,以及指定运算符的方法。PDP-11所使用的指令集结构影响了C语言的语法。
Intel x86 指令系统
x86是由Intel推出的一种复杂指令集,用于控制芯片运行的程序,现在x86已经广泛运用到了家用PC领域。x86架构是重要地可变指令长度的CISC(复杂指令集计算机)。
MIPS 指令系统
MIPS架构是一种采取精简指令集(RISC)的处理器架构,1981年出现,由MIPS科技公司开发并授权,它是基于一种固定长度的定期编码指令集,并采用导入/存储(Load/Store)数据模型。
RISC-V指令系统
RISC-V指的是RISC系列指令集的第五代产品。指令集作为软件与硬件之间沟通的“翻译官”,是芯片产业中不可或缺的基础部分。RISC的指令系统相对简单,它只要求硬件执行很有限且最常用的那部分指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成。