基本概念

定义: 一台计算机能够直接识别并执行的机器指令的集合

这里不关心硬件实现,同一套指令系统可以有不同的硬件实现

与人类语言最大不同:不能模糊不清

设计、扩展必须严格的工程化的方法进行

设计原则

  • 可编程性(Programmability),对于汇编程序员编译器可简单、高效的编程
  • 可实现性(implementability),容易设计出高性能计算机低功耗,可靠,低成本
  • 兼容性(Compatibility),用户向上兼容与向下兼容.

注意:向下兼容和向后兼容等价.

设计要素

  • 指令格式
  • 操作数存储位置,类型,长度,个数
    • 寄存器,主存,累加器,堆栈,…
    • 整型,浮点
    • 字节,字,双字
    • 1,2,3,多操作数
  • 寻址方式
    • 寄存器
    • 立即数
    • 间接寻址
  • 操作类型

根据操作数存储单元分类

  • 仅主存型
  • 累加器型
  • 堆栈型
  • 通用寄存器型

指令系统发展

复杂指令系统CISC

  • 减少指令条数
  • 使用复杂的指令易编程(汇编语言级),程序代码量少
  • 商业上很成功

精简指令系统RISC

  • 减少CPI,使用大量单周期指令
  • 增加了指令条数,但并不太多
  • 可能减少时钟周期时间
  • 技术上胜利者

复杂指令系统存在的问题

  • 设计周期长,准确性难以保证
  • 需要大量硬件支持
  • 很多复杂指令使用频率很低,造成资源浪费.统计显示,使用最频繁的前10条指令在程序中占比达96%
  • 许多指令由于操作繁杂,其CPl值比较大
  • 执行速度慢规整性不好,不利于采用流水技术来提高性能

RISC遵循的原则

  • 指令条数少、功能简单只选取使用频度很高的指令,补充一些最有用的指令
  • 指令格式简单、规整,并减少寻址方式
    • 如:指令字长都为32位或64位
  • 指令的执行在单个周期内完成(采用流水线机制)
  • 只有load和 store指令才能访问存储器,其它指令的操作都是在寄存器之间进行;(即采用1ad- store结构)
  • 大多数指令都采用硬连逻辑来实现;强调优化编译器的作用,为高级语言程序生成优化的代码;
  • 充分利用流水技术来提高性能

早期的RSC微处理器

  • RISC I
  • RISC II
  • MIPS
  • IBM 801

共同特点: 采用load-store结构,指令字长为32位,采用高效的流水技术

电脑上采用的x86为CISC,手机上大多为RISC

MIPS指令系统

MIPS的寄存器

32个64位通用寄存器(GPRs)

  • R0,R1,…,R31,也称为整数寄存器
  • RO的值永远是0

32个64位浮点数寄存器(FPRs)

  • FO, F1,…,F31用来存放32个单精度浮点数(32位),也可以用来存放32个双精度浮点数(64位)-
  • 存储单精度浮点数(32位)时,只用到FPR的一半,其另一半没用。

MIPS的数据表示

  • 整数: 字节(8) 半字(16) 字(32) 双字(64)
  • 浮点数: 单精度浮点数(32) 双精度浮点数(64)

字节、半字或者字在装入64位寄存器时,用零扩展或者用符号位扩展来填充该寄存器的剩余部分。装入以后,对它们将按照64位整数的方式进行运算。

MIPS的数据寻址方式

  • 可以只看做只有立即数与偏移量寻址两种方式
    • 立即数字段和偏移量字段都是16位的
  • 寄存器间接寻址是通过把0作为偏移量来实现的
  • 16位绝对寻址是通过把R0(其值永远为0)作为基址寄存器来完成的
  • MIPS的存储器是按字节寻址的,地址为64位
  • 所有存储器访问都必须是边界对齐的

MIPS的指令格式

  • 寻址方式编码到操作码中
  • 所有的指令都是32位的
  • 操作码占6位3种指令格式:R、I、J型指令
  • 3种格式中,同名字段的位置固定不变

I类指令,

  • 包括所有的|oad和 store指令,立即数指令,分支指令,寄存器转指令,寄存器链接跳转指令。
  • 立即数字段为16位,用于提供立即数或偏移量。
    如下图所示

典型I类指令

  • load指令
    • 访存有效地址:Regs[rs]+ immediate
    • 从存储器取来的数据放入寄存器rt
  • storezhiling
    • 访存有效地址:Regs[rs]+ immediate
    • 要存入存储器的数据放在寄存器rt中
  • 立即数指令
    • Regs[rt] = Regs[rs] op immediate
  • 分支指令转移目标地址:
    • Regs[rs]+ immediate,rt无用
  • 寄存器跳转、寄存器跳转并链接
    • 转移目标地址为 Regs[rs]

R类指令

  • 包括ALU指令,专用寄存器读/写指令,move指令等
  • ALU指令
    • Regs[rd] = Regs[rs] funct Regs[rt]
      如下图所示

J类指令

  • 包括跳转指令,跳转并链接指令,自陷指令,异常返回指令
  • 在这类指令中,指令字的低26位是偏移量,它与PC值相加形成跳转的地址
    如下图所示

课后作业

补充

  • 假设指令字长为16位,操作数的地址码为6位,指令有零地址,一地址,二地址三种格式
    1. 假设操作码固定,若零地址指令有P种,一地址指令有Q种,则二地址指令最多有多少种?(这里的P和Q只是针对前四位操作数而言的,其中每一种都会有好多条……对于某一种指令而言,只是这其中的地址码不同而已)
    2. 采用扩展操作码技术,若二地址指令有X种,零地址指令有Y种,则一地址指令最多有几种?

答:

  1. 操作数的地址码为6位,对于二地址指令而言,操作码的位数为16-6-6=4位,一共有2^4=16种指令,由于操作码固定,那么二地址指令共有16-P-Q种。

  2. 对于二地址指令来说,一共最多有24种指令,每少掉一个二地址指令,我们就为一地址指令增加了26种可能;以此类推,每少掉一个一地址指令,我们就为零地址指令增加了2^6种可能,那么我们可以得到:
    $$
    Y=((2^4 - X) \times 2^6-M) \times 2^6
    $$
    那么我们可以得到
    $$
    M=(2^4-X) \times 2^6-Y \times 2^{-6}
    $$

  • 某台MIPS计算机,程序计数器为PC的值为0xf0003478,无条件相对转移指令“J 10(h)”,则该指令转移的目标地址为0x______。(用十六进制表示)

答: f0003488+4=f000348e


我很好奇