计算机系统的自主设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 自定义指令系统设计

2.1 指令系统概述

2.1.1 指令系统基本概念

计算机能够按照用户预先设计好的步骤有条不紊地运行,是因为用户事先编写了指令代码,并将指令代码存储在存储器中。计算机按照存储器中的指令代码逐条运行。此处所说的指令就是控制计算机各模块协调工作的命令,是一组能实现某个基本操作的二进制代码。指令是程序设计的最小语言单位。

指令系统是所有能对计算机进行操作控制的指令集合,是标志计算机功能是否强大的重要指标,反映了计算机的功能和性能。指令系统越丰富完备,编制程序就越方便灵活。指令系统是根据计算机使用要求来设计的,不同种类的计算机,指令系统所包含的指令数目与格式也不同。

计算机指令一般由操作码和操作数两部分组成,指令格式如图2.1所示。

图2.1 指令格式

① 操作码。操作码说明指令功能,用于规定指令要执行的操作,比如加法运算、移位运算、空操作等。

② 操作数。操作数说明指令运行所需操作数的位置。在操作数部分,可以存放操作数本身,也可以存放操作数的位置。值得注意的是,有的指令不需要操作数,比如空操作指令。

2.1.2 指令系统设计方法

1.指令分类

维持CPU的正常运转需要运算类、通信类和控制类三类操作。

运算类指令负责对数据加工,可细分为算术运算、逻辑运算和移位运算三类。

通信类指令用于实现CPU与存储器、CPU与端口之间的通信。通信类指令是计算机最基本、最重要的操作。在程序编制过程中,通信类指令使用比例最高。图2.2 是CPU、存储器和端口之间的通信框图。

图2.2 计算机各部件之间的通信框图

控制类指令用于控制程序的运行顺序。如果没有控制指令,程序只能顺序运行,有了控制指令,才能实现循环程序、分支程序、子程序等。常用的控制指令有跳转、子程序调用、子程序返回和中断返回等。

2.指令格式与硬件结构

完成同样的指令功能,可以有不同的指令格式;而不同的指令格式又对应着不同的硬件结构。下面将针对指令格式和硬件结构进行讲解。常用的硬件结构有基本机型、栈式机型、累加器机型和通用寄存器机型。

1)基本机型

图2.3所示是基本机模型,模型中的程序计数器PC用于保存指令地址。CPU内部不包含通用寄存器,因此CPU运行所需的数据全部存放在存储器中。运行指令时,CPU首先将数据从存储器中取出,然后将运算结果存回到存储器中。下面以加法指令来说明。

图2.3 基本机模型

假如加法指令格式为“ADDD addr3, addr2, addr1”,加法指令中,addr1和addr2表示两个源操作数在存储器中的位置,addr3表示运算结果在存储器中的位置。基本机执行该指令的示意图如图2.4所示。从图2.4中看出,基本机在运行指令时,需要频繁地访问存储器,从而严重影响运行速度。在实用的计算机中,几乎不使用基本机型。

图2.4 基本机型加运算示意图

2)栈式机型

图2.5所示是栈式机模型,栈式机模型与基本机模型的相同之处是CPU内部包含程序计数器PC用于指向指令地址,不包含通用寄存器。与基本机不同的是,栈式机在存储器中开辟出一块专用的存储空间,这块存储空间称为“栈”,栈地址由寄存器BP和寄存器SP组成,其中BP用于指向堆栈的段基地址,SP用于指向栈顶位置。栈式机运行所需的数据全部存放在堆栈中。运行指令时,CPU首先将数据从堆栈中取出,然后将运算结果存回到堆栈中。同样以加法指令进行说明。

图2.5 栈式机模型

假如加法指令格式为“ADDD”,在加法指令中,两个源操作数存放在SP和SP+1所指定的堆栈位置中,运算结果被回存至SP+1 所指定的堆栈位置。栈式机执行该指令的示意图如图2.6所示。由于栈式机内部没有通用寄存器,因此,在运行指令时,需要频繁地访问存储器,影响运行速度。在实际应用中,栈式机类型也比较少见。

图2.6 栈式机型加运算示意图

3)累加器机型

图2.7所示是累加器机模型,该模型中,CPU内部包含程序计数器PC、一个通用寄存器即累加器。累加器机型在运行过程中可以将其中一个操作数存放在累加器中,其他所需操作数存放在存储器中,运算结果可存放至累加器,也可存放至存储器。同样以加法指令来说明。

图2.7 累加器机型及模型图

假如加法指令格式为“ADDD addr1”,指令中,一个源操作数被存放在addr1所指向的存储单元中,另一个源操作数被存放在累加器A中,运算结果被回存至累加器A中,如图2.8所示。累加器机型内部有一个通用寄存器,指令执行过程中在一定程度上减少了访问存储器的次数,提高了指令执行效率。实际应用中,累加器型机比较常见。

2.8 累加器机型加运算示意图

4)通用寄存器机型

图2.9所示是通用寄存器型机模型,该模型中,CPU包含程序计数器PC和多个通用寄存器,多个通用寄存器组成通用寄存器组。通用寄存器机型在运行过程中,可以将指令运行所需的源操作数以及运算结果存放在通用寄存器组中。以加法指令来说明。

图2.9 通用寄存器机模型

假如加法指令格式为“ADDD addr3, addr2, addr1”,指令中,addr1和addr2表示两个源操作数在通用寄存器组中的位置,addr3表示运算结果被存放在通用寄存器中的位置,如图2.10所示。在通用寄存器机型中,多数指令运行所需的数据以及运算结果被存放在通用寄存器中,因此,指令执行过程中无须频繁地访问存储器,大大提高了运行效率。

图2.10 通用寄存器机型加运算示意图

目前使用的计算机中,不再拘泥于某种具体的模型,而是各种模型机的综合,兼顾各种模型机的优点。各种模型机的指令风格如表2.1所示。实用的计算机模型如图2.11所示。

图2.11 实用机模型

表2.1 指令风格对比

2.1.3 指令系统设计流程

前面讲述了指令的基本概念,本节将完整、系统地讲述自定义指令系统设计流程。虽然不同计算机的指令系统差别很大,但指令系统设计流程是不变的,如图2.12所示。

图2.12 指令系统设计流程

① 指令分类。所谓指令分类,是将指令分为运算类、通信类和控制类,在设计指令系统时,三类指令缺一不可。

② 指令功能选择。选择指令功能时,首先应保证指令系统能实现基本的功能,在此前提下,在指令丰富程度和硬件复杂度之间进行取舍。

③ 指令格式。实现同一个指令功能,可以有不同指令格式。比如实现加法指令可以采用“ADDD addr1, addr2, addr3”、“ADDD addr1, addr2”等格式,具体选择哪种格式视实际情况而定。

④ 寻址方式。指令由操作码和操作数组成,操作数可能存放在计算机的不同位置,如寄存器、存储器中。设计寻址方式就是如何将存放在计算机不同地方的数据取出,或将运算结果存放到计算机的不同地方。

⑤ 指令集。选择了指令功能选择,确定了指令格式、寻址方式后,就完成了指令集定义。

⑥ CPU硬件确定。指令系统是CPU硬件约束条件,指令集确定后,就基本确定了硬件功能和大致结构,在此基础上,设计实现具体的CPU芯片。