1. 指令系统概述

指令是处理器进行操作的最小单元,如加减乘除操作、读写存储器操作等。而指令集则是一组指令的集合。
有了指令集架构,就可以使用不同的处理器硬件实现方案(微架构)来设计不同性能的处理器,此时软件无需做任何修改便可以完全运行在任何一款遵循同一指令集架构的处理器上。事实上,处理器架构和处理器指令集并没有特别的对应关系,比如采用x86指令集也可以用MIPS微结构,MIPS的指令集也可以用在x86处理器的微结构上。

  • 指令系统的设计原则
  1. 完备性:该有的功能都要有
  2. 有效性:简洁、加速常用操作、没有歧义
  3. 规整性:对称、匀齐、一致(简单源于规整)
  4. 兼容性:
    向上(下)兼容:按某档机器编制的程序,不加修改的就能运行与比它高(低)档的机器;
    向前(后)兼容:按某个时期投入市场的某种型号机器 编制的程序,不加修改就能运行于它之前或之后投入市场的机器。
  • 完整的指令系统包括

通常,完整的指令系统根据各个指令的作用权限不同,可分为用户指令集和特权指令集

(1)用户指令系统

  1. 算术运算指令
  2. 逻辑运算指令
  3. 数据传送指令
    load-store等等
  4. 程序控制指令
    branch,jump等
  5. 输入输出指令
    In/Out指令

(2)特权指令系统

该类型指令可以在裸机下运行,也可以由操作系统使用,目的是让计算机更好用,更安全。操作系统通过特权指令系统管理计算机,使应用程序拥有独占CPU的假象,并使应用间相互隔离,互不干扰。

主要包括系统控制指令,如异常与中断处理指令。

  • 指令类型:CISC和RISC

(1)CISC
经典的CISC架构有x86,CISC出现较早,显得大而全。其指令数很多,不仅包含了处理器常用的指令,也包含了许多不常用的特殊指令。
其特征主要有:

  1. 指令系统复杂
  2. 指令周期长
  3. 各种指令都能访问存储器
  4. 有专用寄存器
  5. 采用微程序控制
  6. 难以进行编译优化生成高效目标代码

存在的问题:

  1. 研发周期长
    大量的特殊指令让CPU设计变得复杂,增加了硬件上的时间成本和面积开销
  2. 难以保证设计的正确性,难以调试和维护
  3. 机器的时钟周期长,降低系统性能
  4. 效率低下
    CISC的指令只有20%被经常使用,80%则很少被用到;且20%的指令占据了80%的存储空间

(2)RISC

经典的RISC架构有SPARC,MIPS,Power,Alpha,ARM,ARC,Andes,C-Sky
RISC指令的特征有:

  1. 简化的指令系统
  2. 以寄存器-寄存器方式工作
  3. 指令周期短
  4. 采用大量通用寄存器,以减少访问次数
  5. 采用组合逻辑电路控制,不用或少用微程序控制
  6. 采用优化的编译系统,力求有效的支持高级语言程序

2. 指令格式

  • 指令长度

指令长度取决于操作码长度、操作数地址长度和地址个数

  1. 定长指令字
    所有指令的长度相同,需向最长指令看齐,目前RISC采用该种方式
  2. 变长指令字
    不同指令长度不同,目前大部分CISC均采用该种方式
    使用频度高的指令分配短的操作码,频度低的指令分配较长操作码
  • 操作码设计

每条指令的操作码只能有一个

  1. 定长操作码
    操作码部分采用固定长度编码
    译码简单、但有信息冗余
  2. 扩展操作码
    操作码编码长度分成几种固定长的格式,操作码的位数随地址数的减少而增加
    缩短指令长度,减少程序总位数,怎该指令字所能表示的操作信息
  • 操作码长度和指令长度的关系

指令长度可变和操作码长度可变没有绝对联系

  1. 当追求程序代码长度时会偏向变长指令字、变长操作码设计
  2. 当追求整体性能时会偏向定长指令字、定长操作码设计
  • 指令格式设计的原则
  1. 指令尽量短
  2. 要有足够的操作码位数
  3. 指令编码必须有唯一的解释
  4. 指令字长应是字节的整数倍
  5. 均衡设计、指令尽量规整
  6. 合理选择地址字段的个数
  • 地址码设计
  1. 单地址指令可以是可变长度的指令,也可以定长的指令
  2. 单地址指令可加快取指令速度
  3. 单地址指令可能有一个操作数,也可能有两个操作数

3. 指令寻址

  • 寻址

(1) 寻址方式

寻址方式是如何找到操作数存放位置的方法。

寻址方式分为基本寻址方式和复杂寻址方式。

(2) 基本寻址方式

不同指令集有不同的寻址方式,以下列举一些共有的指令寻址方式:

  1. 立即数寻址
  2. 存储器直接寻址
  3. 寄存器直接寻址
  4. 存储器间接寻址
    指针于间接寻址:指针在程序设计中是地址的地址
    MOV R1, @(1000H)             #两次访存
  5. 寄存器间接寻址
    MOV AX, [BX]                    #一次寄存器访问,一次访存
  6. 偏移寻址
    等同于直接寻址和寄存器间接寻址
    分为先对方式,基址寻址,变址寻址:
    变址寻址即为把变址寄存器的内容(通常是位移量)与指令地址码部分给出的地址(通常是首地址)之作为 操作数 的地址来获得所需要的操作数
  7. 堆栈寻址
    SP:堆栈指令寄存器,永远指向栈顶

(3)目的

  1. 扩大访存范围
  2. 提高灵活性和有效性
  3. 支持软件技术发展:多道程序设计
  • 指令按操作方式分类
  1. 堆栈型:早期计算机,零地址指令,操作数在栈顶,在运算指令中不需要指定操作数,默认对栈顶数据进行运算并将结果压回栈顶
  2. 累加器型:单地址指令,操作数中包含累加器,其余在指令中指定,结果写回到累加器
  3. 寄存器型:register-register:load-store型,操作数由指令显示指定,除了访存指令外,其余指令的操作数均为寄存器
                      register-memory:操作数指令显示指定,操作数为寄存器或内存地址

4. 微指令系统

微指令,微程序设计思想是指将一条机器指令编写一个微程序,而一个微程序包含若干条微指令。

4.1 微指令相关概念

微指令系统中有如下相关概念:微命令、微操作、微指令、微程序

控制部件通过控制线向执行部件发出各种控制命令,通常这种控制命令叫做微命令,是最小单位,组成微指令,而执行部件接受微命令后所执行的操作就叫做微操作。

若干条微指令组成一段微程序,微程序是机器指令的实时解释器,而微程序是由微指令组成。

每个微操作的执行时间都是一个机器周期。

4.2 指令和微指令的区别

(1)表现格式不同:指令是二进制编码,分为操作码和地址码;微指令分为水平型和垂直型、混合型。

(2)透明度不同:指令是程序员编写的,对程序员是不透明的,但是微指令对于一般程序员来说,是透明的,无须知道。

指令和微指令的关系:

一条指令的功能可通过执行一个微程序实现。