Chapter5

指令集体系结构(ISA)

序言

1

  • 思考题:为什么一个软件可以运行在装配有不同Intel处理器的个人电脑上?
  • 思考题:为什么一个软件可以运行在装配有不同ARM处理器的安卓手机上?

兼容性解决了上述问题

2

指令集体系结构定义

  • 指令集体系结构(ISA,也称指令系统),是对处理器硬件细节的抽象描述,即设计规范,定义了处理器能够做什么,也是系统级程序员所能看到的处理器的属性;
  • 指令系统结构不仅仅是关于指令功能的编码(指令集),还包括

3

ISA中的“五朵金花”

4

MIPS指令集体系结构

  • MIPS(无内部互锁流水级处理器)是最经典的RISC处理器,被视为处理器教科书的典范
    • 由斯坦福大学的校长,John L. Hennessy领导的研究小组在1981年开始设计的。
  • 其设计理念就是使用相对简单的指令,结合优秀的编译器以及采用流水线技术执行指令,从而使用更少的晶体管生产出更快的处理器。

5

MIPS体系结构设计准则

  1. 简单设计有助于规整化
  2. 加快常见功能
  3. 越小的设计越快
  4. 好的设计需要好的折中

指令集体系结构为什么重要

  • 指令集体系结构是计算机产业的枢纽,控制产业生态
    • 如成千上万家企业参与到x86生态(x86是最好的ISA吗?)
    • 指令体系结构是计算机软硬件的重要标准
    • 一个人当然可以发明自己的语言,但是如何让别人接受才是真正的问题
  • 指令系统决定系统性能和实现复杂性等
    • 如RISC、CISC
    • 如32位/64位,媒体指令、向量指令等

微体系结构的定义

微体系结构是指指令集体系结构的一种具体硬件实现,如指令的数据通路结构,计算单元的电路结构(加法器等),存储器体系(寄存器文件、主存的结构)等等。

6

汇编语言

定义

  • 计算机机器语言——指明了需要完成什么操作以及操作数的来源
    • 汇编语言:便于人来阅读,包括汇编指令、伪指令(标签)、宏指令等;
    • 机器语言:机器可读(0和1形式)的指令,也叫机器指令;
    • 汇编指令和机器指令是一一对应的关系。
  • 本文主要介绍MIPS汇编指令(汇编语言)
    • 由John Hennessy和同事于1980’s在斯坦福大学提出;
    • 应用于许多商业系统:Silicon Graphics,Nintendo和Cisco等。

加法指令

7

  • 汇编指令格式:助记符 目的操作数 源操作数;
  • add(sub):助记符,表明该指令完成什么操作,也称操作符;
  • b、c:源操作数,表明输入数据的来源;
  • a:目的操作数,表明输出数据的去处。

设计准则1:简单设计有助于规整化

  • 指令格式前后一致
  • 操作数格式一致
  • 易于在硬件中编码和处理

设计准则2:加快常见功能

  • MIPS仅仅包含了简单常用的指令
  • 硬件解码和执行指令可以变得简单、短小、速度快
  • 更复杂的指令由多条MIPS指令完成
  • MIPS为RISC(精简指令),而Intel的x86为CISC(复杂指令)

汇编操作数

操作数物理位置

  • 寄存器
  • 存储器
  • 常熟(立即数)

操作数——寄存器

  • MIPS定义了32个32位寄存器组成的寄存器文件(register file);
  • 寄存器的访问速度快于内存,但存储容量有限;
  • MIPS被称为32位体系,因为其操作的数据宽度为32位数据;
  • 体现了“越小的设计越快”的设计准则。

寄存器

  • 名字前面加$来表示
  • 例如:$0,代表寄存器0

有些寄存器有专有用途

  • $0总是表示立即数0;
  • s0s0-s7为保存寄存器,用于保存变量;
  • t0t0-t9为临时寄存器,用于保存大型计算中的中间值;
  • 本文中除了$0寄存器,其他寄存器可以任意使用。

带寄存器的指令

1
a=b+c;
1
2
# $s0 = a, $s1 = b, $s2 = c
add $s0, $s1, $s2
  • 存储器可以存储更多的数据;
  • 存储器的访问时间更长,故经常使用的变量会存放在寄存器中;
  • 综合使用存储器和寄存器,程序可以以较快的速度访问大量数据;
  • 对于MIPS而言,存储器的地址为32位,一个存储字的长度也为32位;
  • MIPS采用字节编址存储器,每个字节有一个单独地址。但可以按字节、半字和字的方式进行寻址。

MIPS32寄存器

  • 通用寄存器(General Purpose Register)
    • 共计32个×32位,统称为寄存器文件/寄存器堆(Register)
    • 32个通用寄存器均为程序员可见的寄存器
  • 特殊寄存器
    • 用于存储乘/除法结果的寄存器HI和LO,程序员可见
    • 用于存放指令地址的PC(程序计数器),程序员不可见
  • 系统控制状态寄存器
    • CP0协处理器中的寄存器

8

操作数——存储器

  • 存储器可以存储更多的数据;
  • 存储器的访问时间更长,故经常使用的变量会存放在寄存器中;
  • 综合使用存储器和寄存器,程序可以以较快的速度访问大量数据;
  • 对于MIPS而言,存储器的地址为32位,一个存储字的长度也为32位;
  • MIPS采用字节编址存储器,每个字节有一个单独地址。但可以按字节、半字和字的方式进行寻址。

按字编址和寻址

9

注意:MIPS是按字节编址的,不是字编址。为了便于理解,先讲字编址再讲字节编址。

加载指令

  • 读存储器的指令成为加载指令(load指令);
  • 加载一个字的指令助记符为"lw"(load a word);
  • 加载指令格式:lw s0,5(s0, 5(t1)
    • 计算访存地址:基地址($t1寄存器中的值)+偏移量(5);
    • 访存地址 = ($t1 + 5)。
  • 含义:从主存地址"t1+5"t1 + 5"处,读取一个字,将其放到寄存器s0中;
  • 基地址可以存放在任意寄存器中。

存储指令

  • 写入存储器的指令称为存储指令(store指令);
  • 存储一个字的指令助记符为"sw"(store a word);
  • 存储指令格式:sw s0,5(s0, 5(s1)
    • 计算访存地址:基地址($t1寄存器中的值)+偏移量(5);
    • 访存地址 = $t1 + 5。
  • 含义:向主存地址"t1+5"t1 + 5"处,写入寄存器s0中的字;
  • 基地址可以存放在任意寄存器中。

按字节编址

10

  • 每个字节有一个独立地址;
  • 具有加载/存储字节、半字和字指令
    • 加载/存储字节:lb,sb
    • 加载/存储半字:lh,sh
    • 加载/存储字:lw,sw
  • 一个字(32-bit)为4字节,字地址按4递增。

读按字节编址存储器

11

写按字节编址存储器

12

大端和小端

  • 在字节编址的存储器中,根据一个字中的字节存储顺序将存储器的组织方式分为两种:大端(big-endian)和小端(little-endian)
  • 大端:一个字中,最高有效字节存储在低地址;
  • 小端:一个字中,最高有效字节存储在高地址;
  • 两种组织方式,字地址都是相同的,只是一个字中的字节地址不同;
  • 大端/小端由ISA确定,对于MIPS而言,二者都可以使用。

13

14

解析

  • $s0=0x23456789
  • 第一条指令含义为:将地址$s0寄存器中的值存在地址0($0)中;
  • 第二条指令含义为:在地址1(0)0)读取一个字节存入到s0寄存器中;
  • 对于大端存储:先将0x23456789存到地址0(s0)[23456789]1(s0)中,由于是大端存储,则存储顺序为[ 高地址 23 45 67 89 低地址 ],再将地址1(s0)的值读到s0(0+1)45s0寄存器中,即将地址(0+1)的值,也就是45存在s0寄存器中,所以当为大端存储时,$s0的值为0x00000045;
  • 对于小端存储:先将0x23456789存到地址0(s0)[89674523]1(s0)中,由于是小端存储,则存储顺序为[ 高地址 89 67 45 23 低地址 ],再将地址1(s0)的值读到s0(0+1)67s0寄存器中,即将地址(0+1)的值,也就是67存在s0寄存器中,所以当为大端存储时,$s0的值为0x00000067。

思考题

编写一段C程序,确定所运行机器采用的是大端存储还是小端存储?

1
2
3
4
5
6
7
int big_little_endian(){
int i=0x12345678;
char c*=(char *)&i;
return (c*==0x12);
}
//如果返回值为1,则为大端存储
//如果返回值为0,则为小端存储

操作数——立即数

  • 操作数既不来自寄存器,也不来自存储器,而直接来自指令;
  • 立即数通常被表示为一个16位的二进制补码,嵌入在指令中。
1
2
a=a+4;
b=a-12;
1
2
3
# $s0=a, $s1=b
addi $s0, $s0, 4 #a=a+4
addi $s1, $s0, -12 #b=a-12

机器语言

格式

共有3种指令格式:

  • 寄存器类型指令(R型指令)
  • 立即数类型指令(I型指令)
  • 跳转类型指令(J型指令)

寄存器类型指令

15

32位指令字被划分为6个字段

  • op字段表示操作码,通常全为0;
  • func字段与op字段一起决定指令的功能;
  • rs字段和rt字段为寄存器编号,表示两个源操作数来自于寄存器;
  • rd字段表示目的寄存器的编号;
  • sa(shamt)字段只在位移指令中使用,表示移位位数,对于其他R-型指令sa字段为全0。

寄存器类型指令举例

16

立即数类型指令

17

32位指令字被划分为4个字段

  • op字段表示操作码;
  • rs字段为寄存器编号,表示一个源操作数来自于寄存器;
  • imm字段是一个16位立即数,表示另一个操作数,需要扩展至32位;
  • rt字段表示目的寄存器的编号,用于存放指令运行结果。

立即数类型指令举例

18

跳转型指令

19

32位指令字被划分为2个字段

  • op字段表示操作码,用于确定指令的类型;
  • instr_index用于产生跳转的目标地址;
  • 跳转地址:(PC+4)31:28|| instr_index || 00。

总结:3种指令格式

20

单周期MIPS32处理器的设计

MIPS指令集

MIPS最基本的指令集

  • R-type指令:and, or, add, sub, slt;
  • 存储器指令:lw, sw;
  • 分支指令:beq。

扩展:Addi,j …

21

22

设计要求

  • 单周期MIPS32处理器
    • 每条指令均在一个时钟周期完成;
    • 32个32位寄存器,哈佛结构,小端模式,支持23条指令。
  • 数据通路+控制通路
    • 数据通路:完成对指令中操作数的运算、存储等处理工作;
    • 控制通路:从数据通路中接收指令,并对其进行翻译以告知数据通路如何处理;
    • 处理器设计相当于在各个记忆部件之间添加组合逻辑电路,在控制单元的控制下根据当前电路的状态计算出电路的新状态。

概念模型

MiniMIPS32处理器概念模型

23

记忆部件

24

数据通路——LW

STEP1:取指阶段

25

STEP2-1:译码阶段——从寄存器取操作数

26

STEP2-2:译码阶段——另一个操作数进行符号扩展

27

STEP3:执行阶段——计算访存地址

28

STEP4:访存阶段/写回阶段——从数据存储器取回数据,写入寄存器文件

29

STEP5:更新PC——计算下一条指令的地址

30

数据通路——SW

将rt字段指定的寄存器中的数据写入数据存储器

31

数据通路——R型指令

译码阶段从rs和rt寄存器中读操作数;

将ALU运算结果写回寄存器文件;

目的寄存器由rt字段给出。

32

数据通路——分支指令BEQ

判断rs和rt寄存器的值是否相等;

计算分支地址BTA=(sign-extended)(immediate<<2)+(PC+4)

33

控制通路

34

控制单元

35

ALU译码

36

37

主译码

38

addi指令数据通路

39

addi指令主译码控制信号

40

J指令数据通路

41

J指令主译码控制信号

42

单周期处理器的性能分析

43

44

45

46

47

=[30+2(250)+150+25+200+20] ps

=925 ps