指令的定义

用于组成计算机程序、指示计算机硬件执行某项运算或操作功能的命令叫做指令,在计算机内部它是用一定的二进位串来表示的。一台计算机支持(或称使用)的全部指令构成该机的指令系统。指令系统对计算机用户和计算机厂家都有着非常重要的影响。指令是用户设计计算机程序的最小功能单位,计算机厂家需要在计算机硬件系统中实现每一条指令的功能,指令系统直接与计算机系统的运行性能、硬件结构的复杂程度等密切相关,它是设计一台计算机的起始点和基本依据。

要确定一台计算机的指令系统并评价其优劣,通常应从如下4个方面考虑:  (1) 指令系统的完备性,常用指令齐全,编程方便;  (2) 指令系统的高效性,程序占内存空间少,运行速度快;  (3) 指令系统的规整性,指令和数据使用规则统一简单,易学易记;  (4) 指令系统的兼容性,同一系列的低档计算机的程序能在新的高档机上直接运行。

指令的格式

设计指令系统的核心问题是选定指令的功能和格式。指令的格式与计算机的字长、存储器容量和读写方式、支持的数据类型、计算机硬件结构的复杂程度和追求的运算性能等有关。   通常情况下,一条指令要由如下两部分内容组成:

cnc指令代码大全(计算机指令系统)(1)

第一部分,是指令的操作码。操作码用于指明本条指令的运算和操作功能,例如,是算术加运算、减运算还是逻辑与运算、或运算功能,是否是读、写内存或读、写外设操作功能,是否是程序转移和子程序调用或返回操作功能等,计算机需要为每条指令分配一个确定的操作码。

第二部分,是指令的操作数地址,用于给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址,运算结果的保存地址,程序的转移地址、被调用的子程序的入口地址等。  在一条指令中,如何安排指令字的长度,即使用多少个二进制位(bit)表示一条指令,又如何分配指令字中这两部分所占用的位数(长度),如何安排操作数的个数,如何表示和使用一个操作数的地址(寻址方式),是设计指令的重要问题。

操作码的组织与编码

指令字的长度,多数情况下就确定为计算机的字长,即一条指令占用计算机的一个字,由几个字节组成,例如2、4、6、8个字节,但并不一定要求所有的指令的字长都相同,例如,一个计算机字中,可以存放几条很短的指令,长的指令也可能占用多个计算机字,目的在于提高资源利用率。从对指令操作码的组织与编码所选用的方案分类,一般分为以下2种处理情况。

(1) 定长的操作码的组织方案,在当前多数的计算机系统中,一般都在指令字的最高位部分分配固定的若干位(定长)用于表示操作码,例如8位,它有256个编码状态,故最多可以表示256条指令。这对于简化计算机硬件设计,提高指令译码和识别速度很有利,当计算机字长为32位或更长时,采用这种操作码的组织方案。

(2) 变长的操作码的组织方案,当计算机的字长与指令长度为16位或8位时,单独为操作码划分出固定的位数后,留给表示操作数地址的位数就会严重不足。为此设计时使一些位(bit)在不同的指令中有不同的作用,例如,在一些指令中,这些位用作操作码,而在另外一些指令中,这些位用作操作数的地址,则不同指令的操作码长度就会不同。  设计时尽量为那些最常用(程序中使用频率高)、用于表示操作数地址的位数要求又较多的指令,适当少分配几位操作码(当然能表示的指令条数也就少);而对那些表示操作数地址的位数要求较少的指令多分配几位操作码;对那些无操作数的指令,整个指令字的全部位都用作操作码,力争在比较短的一个指令字中,既能表示出比较多的指令条数,又能尽量满足给出相应的操作数地址的要求。

操做数的类型

从用到的操作数个数区分,有如下4种情况:   (1) 无操作数指令,有的指令不涉及操作数,或使用约定的某个(些)操作数,既已约定则没有必要再在指令中加以表示,称这类指令为无操作数指令,它仅有操作码部分,例如停机指令、空操作指令、关中断指令、堆栈结构的计算机系统中对堆栈中数据运算的指令等。

(2) 单操作数指令,有些指令只用一个操作数,必须在指令中指明其地址,如一个寄存器内容增1或减1运算的指令;或还使用约定的某个操作数,既已约定则无需再在指令中加以表示,如完成从(向)外设读(写)数据的指令,就可以只在指令中指明该外设地址,而把接受(送出)数据的通用寄存器约定下来。此外,在短字长的、采用单个累加器的计算机中,已约定目的操作数(如被加数、被减数等)和保存计算结果都使用唯一的那个累加器,指令中只需指定另外一个源操作数即可。称上述这些指令为单操作数指令。

(3) 双操作数指令,对于常用的算术和逻辑运算指令,往往要求使用两个操作数,需分别给出目的操作数和源操作数的地址,其中目的操作数地址还用于保存本次的运算结果。在寄存器与主存储器之间完成数据传送的指令,也需要给出寄存器编号和主存储器地址。称这类指令为双操作数指令。  (4) 多操作数指令,另外一些指令可能使用多个操作数,如3个操作数,其中两个操作数地址分别给出目的操作数和源操作数的地址,第三个操作数地址用于指出保存本次运算结果的去处,可以称这类指令为三操作数指令;在有些性能更高的计算机(甚至PC机)中,还有在指令中使用更多个操作数地址的指令,用于完成对一批数据的处理过程,如字符串复制指令,向量、矩阵运算指令等,称这类指令为多操作数指令。  上述4种情况中的前3种,由于其指令字长可以相对较短,执行速度较高,计算机硬件结构可以相对简单等优点,在各种不同类型的计算机中被广泛应用;相对而言,最后一种更多地用在字长较长的大中型计算机中。

操作数的来源去向和地址安排

这里说的操作数的来源、去向,是指在指令中操作数要从哪里读来、写向哪里去。不同的指令使用不同数目、不同来源、不同用法的操作数,必须有办法尽量把它们统一起来,并安排在指令字的适当位置(字段)。   (1)操作数的来源、去向可分为如下3种情况。

操作数的第一个来源、去向,可以是CPU 内部的通用寄存器,此时应在指令字中给出所用的寄存器编号(寄存器名),通用寄存器的数量一般为几个、十几个,一、二百个,故在指令字中须为其分配2、3、4、5或更多一点的位数来指明一个寄存器;该寄存器中的内容,可以是指令运算用到的数据,也可能用作为一个操作数或者指令的地址,或计算主存储器地址的相关信息。

操作数第二个来源、去向,可以是外围设备(接口)中的一个寄存器,通常用设备编号、或设备入出端口地址、或设备映像地址(与内存储器地址统一编址的一个设备地址编号)来表示。  操作数的第三个来源、去向,可以是内存储器的一个存储单元,此时应在指令字中给出该存储单元的地址。由于许多计算机用到的内存地址的位数,就是一个机器字的长度,要在一个指令字中既给出操作码,还要直接给出这一内存地址是困难的;而且,还有采用多种不同方式读写内存的需求;再考虑到尚需把其它数据来源、去处等统一安排在指令字的操作数地址字段,这就需要找到解决这些需求的完整方案。  指令中使用的基本数据类型,通常包括逻辑类型(bit),整数类型(integer),浮点数类型(floating)等,通常需要结合指令的操作码来判断数据类型并完成相应的运算处理。

指令的分类

一台计算机的指令系统往往由几十条到几百条指令组成。可以从不同的角度对这些指令进行分类。常用的还是按指令所完成的功能进行分类。   (1) 算术与逻辑运算类指令,它通常完成对一或两个数据的算术运算或逻辑运算功能。不同档次、不同性能的计算机所能加工、运算的数据类型(整数、浮点数、十进制数等)和支持的运算功能(加、减、乘、除、变符号等)的完备程度可以有所差异,但一般都须给出算术与逻辑运算的结果,以及结果的有关特征。

(2) 移位操作类指令,包括算术移位、逻辑移位、循环移位三种,用于把指定的一个操作数左移或右移一(多)位。

(3) 数据传送类指令,用于实现通用寄存器之间、通用寄存器与内存存储单元之间、内存不同的存储单元之间、通用寄存器与外围设备(接口)之间(有些场合也可以单独划分为输入/输出指令)的数据传送功能。从内存储器和外围设备(接口)操作性质的不同,又可以区分为读和写两种操作,它指明数据传送的方向。  (4) 转移类指令,用于解决变动程序中指令执行次序的需求。  转移指令,是一种改变程序中指令执行次序的指令。程序中的指令,大部分是按指令排列的自然次序顺序执行,但有时候又要求不执行邻接的下一条指令,而是转移到另一段程序入口处开始执行,此时就会用到一条转移指令。转移指令又被区分为无条件转移和条件转移两类,二者的相同之处是都必须在指令中给出转移地址,不同之处是,条件转移指令还必须在指令中给出判断是否执行转移所依据的条件,仅在条件为真时才执行转移,否则顺序执行;而无条件转移指令必定执行转移。  (5)子程序调用指令与返回指令,可以被理解为一种特定的转移指令,二者要配合使用,通过子程序调用指令,使一段被称为子程序的特定程序段投入运行,而该程序段的最后一条指令,一定是一条子程序返回指令,它会使子程序运行结束后,确保转移回到排在子程序调用指令之后的那条指令处接着执行。而一般的转移指令,并不涉及再返回来的问题。再深入一步讲,子程序又可以被分为用户自己编写的子程序和软件系统提供的子程序两大类,这后一部分又被称为访问系统程序(访管)指令、陷阱(TRAP)指令。  (6) 特权指令,是指仅用于操作系统或其它系统软件的指令,为确保系统与数据安全起见,这一类指令不提供给用户使用。这一类指令主要用于管理与分配系统资源,包括改变系统的工作方式,完成任务的创建或切换,变更管理存储器用的段表和页表中的内容等。特权指令对多用户或多任务系统是必要的。  (7) 其它指令,如动态停机指令、空操作指令、置条件码指令、开中断指令、关中断指令、堆栈操作指令等,用于完成某些特定的处理功能。

指令周期及对计算机性能的影响

简单介绍有关的几个基本概念。   通常把执行一条指令所用的时间叫做指令周期。一个指令周期往往要包含几个执行步骤,例如可能包括读取指令、指令译码和读寄存器组、ALU执行运算、读写内存或接口、数据写回寄存器组这5个步骤,就是说,要依次经过这几个步骤的操作才能完成一条指令的具体功能,如图4.1所示。

cnc指令代码大全(计算机指令系统)(2)

图4.1 指令的5个执行步骤

(1)读取指令的步骤是每一条指令都必须执行的,所完成的功能对所有指令都相同;

(2)指令译码步骤完成的功能对多数的指令是类似的,例如判断指令类型、读寄存器组等;  (3)ALU执行的步骤所完成的是数据计算或者地址计算功能,对不同指令会有所区别;  (4)读写内存或接口这一步骤,只被用于读写内存或者读写接口的指令;  (5)数据写回步骤,完成把ALU的计算结果,或从内存,或从接口读来的数据写入寄存器组。  每条指令都是在取指——译码——执行的循环中完成的。当然,在一条指令执行的过程中,还一定要计算出下一条指令的地址并保存,以保证程序(指令序列)得以自动连续执行。  在计算机内部,从如何选择、处理这5个执行步骤的角度来看,可分为如下3种方案,每个方案对指令执行速度和计算机硬件实现的复杂程度等有较大影响。  第1种方案,不管指令功能的复杂程度,让所有指令都经过这5个步骤完成,即全部指令都选用同一种指令周期,从而构成单指令周期的CPU系统。此时必须依照功能最复杂、执行用时最长的指令的运行要求来确定指令周期长度,否则系统运行会出错。对那些功能简单,只用更少执行步骤就能完成的指令,就势必遇到一些无操作功能的执行步骤,造成执行时间上的浪费,降低了系统的运行效率。此外,这个方案不利于在一条指令执行过程中的硬件部件的分时共享,系统资源利用率最低。  第2种方案,依据不同指令功能的繁简程度来分别确定各自的指令周期,指令需要几个执行步骤完成就为它分配几个步骤,此时可能有分别用2个步骤、3个步骤、4个步骤或5个步骤完成的指令,此而构成多指令周期的CPU系统。这一方案明显的优于前一方案,指令执行速度和硬件部件的资源利用率更高,是一种比较实用的方案。  第3种方案,属于指令流水线的CPU系统,它的思路在于尽可能地在指令的每一个执行步骤都启动一条指令,使程序中几条相邻指令的执行时间尽可能的重叠起来,就像工业生产中的流水线,故称指令流水,它与前2种方案有明显区别。前2种方案实现的是指令的串行执行,即前一条指令完成之前不会启动下一条指令,在任何时间都只有一条指令处在运行中,当确定采用5个步骤的指令流水线时,理想情况可能有5条指令各自处在不同的5个步骤中。这种方案会使得硬件设计与实现更复杂一些,但带来了更高的性能价格比,是目前被广泛选用的、更加实用的方案。

,