/ 知识库     / 试卷库

指令集

视频简介

计算机的设计者在设计一款新的计算机时,首先考虑的是为程序员提供什么样的功能操作,以支持其编写面向终端用户的应用程序。这些功能操作的集合构成了计算机的指令集,或指令系统,设计者需要基于硬件逻辑设计每一条指令的功能,并将指令集封装好供软件程序调用,所以指令集就是计算机软硬件的中间线。

20世纪60年代,集成电路设计与生产水平较低,处理器的外在形式是一个集成有多个芯片的电路板。到了70年代,Intel公司生产了一种简陋的4位处理器,由于它的电路简单,所以可以集成在一个芯片里。这种由单个芯片实现的处理器称为微处理器。

时至今日,一个普通微处理器的性能已经远远超过20世纪70年代一台亿次计算机的性能,而所有的处理器都是以单个芯片的形式出现,所以处理器与微处理器已经不再区分。目前,高档的微处理器内部往往集成了多个处理单元,这样的微处理器又称多核处理器。

处理器作为一种电子器件是为人所用的,然而人们无法直接操纵计算机,计算机也无法直接领会人的思想、语言和动作。因此,人们设计了一种特殊的符号来与计算机进行交流,指挥计算机执行人们所希望完成的工作,这种特殊的符号就称为计算机指令,简称指令 Instruction。

更形象地说,人与计算机交流所用的符号称为指令,由所有可采用的符号组成的集合,也就是一台计算机的全部指令,称为指令集或指令集体系结构,在国内,常称为指令系统。

将指令按照一定的逻辑顺序 组合在一起就形成了控制计算机工作的程序,也就是指令对上层程序员的支撑。然而指令并不是最小的执行单位,它还需要被逻辑电路解释成更微观的执行步骤,也就是微程序。这就是指令的硬件实现逻辑,一般由计算机的设计者或生产者定义并实现。所以我们说 指令集是整个计算机层次结构中软硬界面的分界。

从某种意义上说,计算机的指令集 是计算机的逻辑表示,它定义了计算机的基本属性、功能和性能。主要体现在以下5点:

1 指令的功能直接反映了计算机的功能。例如,如果一台计算机是面向科学计算应用的,则它不仅应该具有定点的加减乘除指令,而且还应该具有浮点的加减乘除指令。如果一台计算机想具有实时控制和逻辑处理功能,就应该增加测试指令、逻辑运算指令以及灵活的程序控制指令。

2 指令的功能决定了计算机的可编程性。例如,要实现乘除运算,在具有乘除指令的计算机上,只需要一条指令就可完成,但是在只具有加减指令的计算机上,就需要借助移位指令和加法指令来编制一个乘除子程序来实现乘除运算。这样就降低了程序开发的效率和程序的可读性。因此,我们说后一台计算机的可编程性要比前一台计算机的可编程性差。

3 指令集所包含的操作,直接决定了运算单元的规模与组成。也就是说,指令集规定了处理器的组成与规模。

4 指令集本身对存储空间的占用方式,它所指定的操作数类型及其存取方式,在很大程度上决定了主存储器的规模与组成。

5 指令集中输入输出指令的处理能力规定了处理器I/O操作的功能与性能。

目前,绝大多数计算机都是电子数字式计算机,其所能够直接识别的是由0和1排列组合而成的指令,这种指令专称为“机器指令”。早期,人们通过穿孔纸带来向计算机输入用机器指令编写的程序,有孔代表1,没孔代表0。但这很不方便,后来人们又设计出汇编语言来简化程序的编写与输入。

汇编语言就是基于英文的机器指令的助记符。例如,某个机器指令原来用0101来表示要执行加法运算,现在引入助记符ADD或add来表示0101,方便了人们编写程序。

按汇编语言书写的程序称为汇编语言源程序,汇编语言源程序由汇编程序转换成机器指令,供计算机接收并执行。

汇编语言的提出是计算机技术的一大进步,体现了计算思维的一个重要概念——抽象。计算机程序设计语言的发展过程就是不断抽象的过程。通过抽象,程序设计语言具有了更好的可编程性、可移植性、可从用性。

一般在描述指令或指令集时,都是基于汇编语言的形式。

在冯·诺依曼型计算机中,机器指令一直采用指令操作码+指令操作数的统一逻辑格式。

指令操作码是一个二进制数的码点,规定了指令所具有的功能,由微指令解释执行;指令操作数是指令所要处理的数据,其中,作为处理单元输入的称为源操作数,用于存放处理结果的称为目的操作数。通常,操作数是以数据所在存储单元的地址形式给出的,因此,指令操作数又称为“指令地址码”。在一条指令中,操作数可能有一个、两个或三个,甚至更多。只不过操作数增多会增加指令实现的复杂度,并导致计算机成本的增加。

对于双操作数 运算类指令,需要处理4个地址信息:

① 第一操作数地址,用A1表示;

② 第二操作数地址,用A2表示;

③ 操作结果存放地址,用A3表示;

④ 下条将要执行指令的地址,用A4表示。

这些信息可以明显的给出,称为显地址;也可以依照某种事先的约定,用隐含的方式给出,称为隐地址。

四地址指令就是4个地址信息都在地址字段中明显的给出,这使得指令的长度太长,而且程序将不能根据操作结果灵活的转移,所以是不切实际的。

三地址指令不再明显地给出下条将要执行指令的地址了。指令的含义为:A1、A2进行OP操作,结果存于A3。

二地址指令让第一操作数地址同时兼作结果存放地址(目的地址),指令的含义为:A1、A2进行OP操作,结果存于A1。

一地址指令只有一个显地址,参加运算的另一个操作数来自累加寄存器Acc。指令的含义为:累加器Acc的数据和A1进行OP操作,结果存于累加器。

零地址指令中只有操作码字段,零地址的运算类指令是用在堆栈计算机中的。参加算术逻辑运算的两个操作数隐含地从堆栈顶部弹出,送到运算器中进行运算,运算的结果再隐含地压入堆栈。

从程序长度、程序存储量、执行速度和适用场合等方面,对以上指令进行总结:

三地址指令,程序长度短,存储量最大,执行速度一般,主要用于向量、矩阵运算等;

二地址指令,程序长度一般,存储量很大,执行速度很低,一般不宜采用;

一地址指令,程序较长,存储较大,执行速度较快,主要应用于硬件结构简单的连续运算;

零地址指令,程序长度最长,存储量也最小,执行速度最低,主要用于解决嵌套、递归问题。