4.4指令系统的组成部分

  • 指令的主语:CPU
    • 指令主语都一样,主语省略
  • 指令包括操作码和操作数操作码相当于谓语
    • 来指定操作
  • 操作数相当于宾语,是被操作的对象
  • 还需对指令编码,编码可定长,也可变长
    • 一句话可长可短
  • 这节讨论指令的组成部分
  • 从数据类型、访存地址、寻址方式等几个方面讨论操作数部分
  • 然后操作码部分,
  • 最后指令编码

  • (1)数据类型
  • 常见数据类型
    • 整数、实数、字符
    • 数据长度为字节、半字、字和双字
    • 有些指令系统(如X86)有专门的十进制数据类型。

  • 在指令中表达数据类型有两法
  • 操作码来区分不同类型,这是最常用
    • 加法有定点加法指令、浮点加法、双精度加法和单精度加法
  • 数据上附带一个由硬件解释的表示类型的符号,
    • 通过该符号表示操作数类型
      • 加法指令用统一操作码,用专门的标志来表示加法的数据类型是定点、浮点、单精度还是双精度。

  • (2)访存地址。
  • 指令可访问的通常有两个地址空间,
    • 寄存器,存储器。
  • 寄存器的访问比较简单,都是直接在指令中指明寄存器号;
  • 存储器访问复杂,不同的指令系统有不同的规定。
  • 所有的存储器都是统一按字节编址的,所有的地址都是字节地址。
  • 如果有的机器地址是字地址,有的机器地址是字节的地址,
    • 那写程序就相当麻烦了

  • 但其他方面就不统
  • 访问长度有
    • 字节、半字、字和双字
  • 指令系统(如X86)认为字是16位,双字是32位,
  • 很多RISC中,字节是8位,半字是16位,字是32位,双字是64位

  • 指令系统
  • 是否支持不对齐的访存,跨数据边界的访存。
  • 对齐访问
    • 访一个半字,地址最低一位就必须为0;
    • 访一个字,最低两位等于0;
    • 访一个双字,最低3位等于0。
  • 对齐访问硬件实现起来简单些。
  • 如果实现不对齐访问,一个访问可能需要访问两次cache或内存
  • 访问地址为61~68的一个双字
    • cache块的大小为32字节
    • 61~63字节部分在 cache中,而64~68字节部分不在 cache中,实现起来麻烦
  • 只支持对齐访问,会使指令系统丧失灵活性
  • 串操作就喜欢非对齐访问,
    • 如果访问8个字节长的一个串也要求串地址最低3位都是0
      • 那就别扭
    • 要取字节5到字节12的串,就得访两次
      • 先取字节5~7这3个字节
      • 再把后面的几个字节取进来,拼到一起。
    • 有一些指令系统对非对齐的访问有一些特殊的支持

  • 跟访存地址相关的问题就是大尾端和小尾端
  • 严重影响不同机器间数据兼容性
  • 小尾端的地址指向最右字节,大尾端反之
  • 8字节(0~7来表示一个64位的数,最低位在字节0,就是小尾端;
    • 最低位在字节7,就大尾端
  • X86小尾端,而IBM的计算机则用大尾端。
  • 一些指令系统如 Sparc都支持小尾端,可相互切换。

  • (3)
  • 是如何在指令中表示所要访问的内存地址。
  • 最常见的
    • 基址加偏移量,用一个寄存器的值加上一个立即数来作为地址。
  • 两个寄存器的值相加作为地址,这种寻址方式访问二维数组,
    • 一个寄存器表示行地址,一个寄存器表示列地址,这样比较灵活。
  • 当然用一个寄存器也可以访问二维数组,但要多做一些地址运算。
  • 更复杂的寻址方式有内存间接寻址,即把一个寄存器的值当作地址去访问一个内存单元,把内存单元的值取回来,当作地址再从内存里面取一个值,那个值才是所需要的。
  • 还有就是自动增(减)量寻址,每次访存结東了,寄存器的值
    就自动加(减)1。

  • 表4.2计算机中常用的寻址方式
  • mem表示存储器,数组regs表示寄存器
  • mem[regs[R1]指的是由寄存器R1的内容指定的内存地址的内容

4 ISA

4.6RISC的发展历史

  • 64年,CDC推出世界第一台超算CDC6600。
  • 已具备RISC的一些基本特征。
  • 设计者认识到,为了实现有效的流水技术,需要简化体系结构。
  • 现代处理器的很多关键技术都在CDC6600上已经显现维形。
  • CDC6600采用load-store结构,运算指令只对寄存器操作,
    • 而不对内存操作;
  • 用计分板( Scoreboard)技术进行动态流水线调度,
    • 还用乱序执行技术,尽管还不是很彻底的乱序执行。

  • 1976年推出的Cray-1向量机的设计思想与CDC6600类似。
  • Cray公司的创始人Seymour Cray本人就是CDC6600的主要设计师之一。
  • 但上述简化结构以方便硬件高效实现的理念在六七十年代没有受到小型机和微处理器设计者的重视

  • 68年, John Cocke在IBM公司的San Jose研究中心领导研究项目ASC( Advanced Scientific Computer)。
  • 他的基本思想就是让编译器做更多的指令调度,以降低硬件复杂度,
    • 并提出每个周期发射多条指令。
    • 然而,这个计划后来被取消了。
  • Cocke于71年来到 Future System公司,
    • 75年他又回到IBM公司的 Yorktown研究中心开始研制IBM
      801。
  • IBM801是所有RISC计算机的鼻祖,
    • 最早开始设计RISC处理器的Cocke因此获图灵
    • 现在IBM Powerpc系列CPU的主要思想源于IBM801。

  • 参与IBM801项目的Patterson和 Hennessy,回加州伯克利和斯坦福,开始从事RISC-1/RISC-2项目以及MIPS项目
  • RISC-2项目是 SPARC处理器前身
  • MIPS项目是MIPS处理器前身。
  • IBM801的项目经理 Joel Birnbaum在HP创立了PA-RISC。
  • 推出Alpha之前,DEC公司曾经使用了3年的MIPS处理器
    • Alpha的设计人员大都设计过MIPS处理器

  • MIPS、Powerpc和 SPARC是较早出现的RISC结构,
  • Alpha是从MIPS里分离出来的。
  • 它们实际上都是表兄弟, Alpha跟MIPS更是亲兄弟。
  • 不难理解刚开始时5个RISC处理器所具有的相似性。
  • 表4.3给出了上述RISC指令系统的发展历程

4 ISA

  • 后来,每个RISC处理器不断加入新指令,因而有了各自的特点和发展。
  • Powerpc指令功能强、使用灵活,
    • RISC里的CISC;
  • Alpha指令非常简单,
    • 超标量流水结构,流水级数多,主频高
  • 1992年,MIPSⅢ和 Alpha都已经实现64位结构,
    • X86直到2003年才实现64位
  • Alpha一开始就是64位,
    • 它对RISC指令系统一次扬弃,
    • 舍弃早期RISC的一些缺点,
    • 并增加了一些有用特色

相关文章: