02 指令 | 计算机组成原理

1. 指令系统

1. 指令系统概述

  1. 指令系统:是计算机硬件的语言系统,它是软件和硬件的主要界面,从系统结构的角度看,指令系统表征了计算机的基本功能,决定了机器所要求的能力
  2. 指令系统设计原则
    1. 完备性:提供的质量足够解决任何可解的问题
    2. 有效性:简洁加速常用操作,没有歧义
    3. 规整性:对称、匀齐、一致
    4. 兼容性:对于之前和之后的版本都能使用
  3. 完善的指令系统的组成部分
    1. 数据传送指令:\(Load/Store\)指令
    2. 输入输出指令:\(In/Out\)指令
    3. 算术运算指令:\(Add\)等指令
    4. 逻辑运算指令:\(And\)等指令
    5. 系统控制指令:中断等指令
    6. 程序控制指令:\(Jump\)等指令

2. 两种指令系统计算机\(CISC\)\(RISC\)

  1. \(CISC(Complex Instruction Set Computer)\):复杂指令集计算机
    1. 特点
      1. 指令系统复杂
      2. 指令周期长
      3. 各种指令都能访问存储器
      4. 用专用的寄存器
      5. 采用微程序控制
      6. 难以进行编译优化生成高效的目标代码
    2. 存在的问题
      1. 研制周期长
      2. 难以保证设计的准确性,难以调试和维护
      3. 机器的时钟周期长,降低了系统性能
      4. 效率低下
  2. \(RISC(Reduced Instruction Set Computer)\):精简指令集计算机
    1. 特点
      1. 简化的指令系统
      2. 以寄存器-寄存器的方式工作
      3. 指令周期短
      4. 采用大量通用寄存器,以减少访存次数
      5. 采用组合逻辑电路控制,不用或少用微程序控制
      6. 采用优化的编译系统,力求有效地支持高级语言程序
    2. 常用的\(RISC\)指令集
      1. \(ARM\)
      2. \(MIPS\)
      3. \(RISC-V\)
      4. \(DECAlpha\)
      5. \(SPARC\)
      6. \(PowerArchitecture\)

2. 指令格式

1. 指令格式的组成

  1. 组成:指令 = 操作码 + 地址码;一条指令包括1个操作码和多个操作码
  2. 指令按组成分类
    1. 零地址指令 [OP]
    2. 一地址指令[OP][Address1]
    3. 二地址指令(最常用)[OP][Address1, Address2]
    4. 三地址指令(\(RISC\) 风格)[OP][Address1, Address2, Address3]
    5. 多地址指令

2. 操作码的设计

  1. 操作码长度
    1. 定长操作码:指令操作码部分采用 固定长度 的编码
      • 特点:译码简单,但是会有信息冗余
    2. 扩展操作码:指令的操作码部分采用 可变长度 的编码,将操作码的位数分为几种固定长度的格式,操作码的位数随地址数的减少而增加
      1. 优点:
        1. 缩短指令长度
        2. 减少程序总位数
        3. 增加指令字所能表示的信息
      2. 重要原则:使用频度高的指令对应更短的操作码;使用频度低的指令对应较长的操作码
  2. 操作码相关计算
    • 例:某指令系统指令字长16位,每个地址码为6位。若二地址指令15条,一地址指令34条,则剩下零地址指令最多有多少条?
      解: 操作码按短到长进行扩展编码
      二地址指令: (0000 ~ 1110)
      一地址指令: 11110 (00000 ~ 11111);11111 (00000 ~ 00001)
      零地址指令: 11111 (00010 – 11111); (000000 – 111111)
      故零地址指令最多有: \((2^5-2) ×2^6=15×2^7\)

3. 寻址方式

1. 指令系统的寻址

  • 指令 寻址和 操作数 寻址

2. 基本寻址方式分类

  1. 立即数寻址
    1. 方式:源操作数直接就在指令中
    2. 特点
      1. 指令执行时间短:直接从指令中取操作数
      2. 操作数大小受到地址字段的限制
      3. 广泛使用
  2. 存储器直接寻址
    1. 方式:操作数在 存储器 中,指令中的是操作数在存储器当中的 地址
    2. 特点
      1. 处理直接,简单
      2. 寻址空间受到指令的地址字段长度的限制
      3. 较少使用,只有少数的 \(8\) 位计算机和 \(16\) 位计算机使用
  3. 寄存器寻址
    1. 方式:操作数在 寄存器 中,指令中的是操作数存放的 寄存器编号
    2. 特点
      1. 只需要很短的地址字段:寄存器数量较少
      2. 无需访问内存储器,指令执行速度快
      3. 地址范围有限,可以为编程使用的寄存器不多
      4. 使用最多,是提高性能的常用手段
  4. 存储器间接寻址
    1. 方式:操作数和操作数的地址都在 存储器 中,指令中的是操作数地址在存储器当中的地址
    2. 特点
      1. 寻址空间大,灵活,易于编程
      2. 至少需要两次访存才能取到操作数,执行速度慢
  5. 寄存器间接寻址
    1. 方式:操作数在存储器中,操作数地址在 寄存器 中,指令中的是 寄存器编号
    2. 特点
      1. 寻址空间大,较为普遍
      2. 比存储器间接寻址少访问一次存储器
  6. 偏移寻址
    1. 相对寻址:NextAddress = (PC) + A:相对当前指令地址PC,位移量为A的单位
    2. 基址寻址:NextAddress = (Base) + A
      1. 相对于基址 Base 处位移量为 A 的单元
      2. 应用:程序 重定位
      3. 主要面向计算机系统
      4. 偏移位数较短
    3. 变址寻址:NextAddress = (I) + A
      1. 相对于形式地址 A 位移量为 (I) 的单元
      2. 应用:实现线性表元素的存取(如数组)
      3. 主要面向用户
      4. 偏移维数足以表示整个存储空间
  7. 堆栈寻址

3. 寻址方式的确定

  1. 在操作码中给定寻址方式
  2. 专门的寻址方式位

4. 存储器编址单位

  • 一般是字节编址(一个地址为一个字节)

4. 数据的表示

1. 数据的基本概念

  1. 数据变量的六要素:名称,类型,值,地址,作用域,生命周期
  2. 数据宽度
    1. bit :计算机处理存储传输信息的最小单位
    2. 字节 byte :计算机中二进制信息的主要存放单位,现代计算机的主存是按字节编址,字节是最小的可寻址单位,1byte = 8 bits
    3. word :表示被处理信息的单位,用来度量数据类型的宽度
    4. 字长 word length :子长是指 \(CPU\) 数据通路的宽度,等于 \(CPU\) 内部总线的宽度或者运算器的位数或者通用寄存器的宽度等

    字和字长的 区别

    字是处理信息的单位,和字长的宽度可以一样也可以不一样,通常是字节 byte 的整数倍

2. 正数与负数

  1. 原码:用 0 表示正数,用 1 表示负数
    • val = +90,二进制原码为 0 1011010
    • val = -90,二进制原码为 1 1011010
  2. 反码:如果是负数,直接将二进制真值 逐位取反
  3. 补码:如果是负数,在反码的基础上 加一
  4. 移码:与补码的符号位相反:即 用 1 表示正数,用 0 表示负数

3. 浮点数 \(IEEE 754\)

  1. 符号位 S:1表示负数,0表示正数

  2. 尾数 f:尾数为原码,其中对小数进行 规格化,使得最高位总为1,然后隐含这一位的表示;因此单精度表示精度为 \(1+23\) bits,双精度表示精度为 \(1+52\) bits(尾数精度=尾数的位数 + 1)

  3. 阶码 e

    1. 偏置常数 bias:对于每一个阶数都要加上一个偏置常数,便于浮点数加减运算以及比较操作的时候进行 对阶操作
    2. 单精度的偏置常数为 127,双精度的偏置常数为 1023

    为什么不是单精度的偏置常数不是 \(2^7 = 128\)

    原本利用移码的操作应该加上 \(2^{n-1}\) 的固定值,但是 \(IEEE 754\)为了处理一些特殊情况:无穷\(\infty\), NaN(Not a Number) 和 \(0\) 等,因此除去这些特殊的情况后设置的偏置常数为 \(2^{n-1}-1\)

  4. 单精度表示
    image

  5. 双精度表示
    image

  6. 转换公式(以单精度为例)

    1. 将二进制浮点转换为十进制

      \[Num_{10} = (-1)^S \times (1 + f) \times 2^{e - 127} \]

    2. 将十进制小数转换为二进制浮点型
    3. 对整数和小数进行二进制转换
    4. 规格化:整数部分只留下1
    5. 阶码加上 127
  7. 浮点数的特殊值表示
    image

  8. 单精度范围:\(-3.40\times 10^{38} \sim +3.40\times 10^{38}\)

  9. 双精度范围:\(-1.79\times 10^{308} \sim ~ +1.79\times 10^{308}\)

  10. 浮点数加法不符合结合律

4. 数值数据的十进制表示

  1. \(ASCII\)
    1. 把十进制数看作字符串,0~9分别对应 \(30Hex\sim 39Hex\),一位十进制数用八位二进制表示
    2. 正负数
      1. 方法一:直接加正号负号的\(ASCII\)码:+:2B Hex,-:2D Hex
      2. 方法二:符号位嵌入到最低位数字的ASCII码的高4位,省一个字节
        1. 正数:最低位数字的高四位不变
        2. 负数:最低位数字的高四位变为 0111
  2. \(BCD\)
    1. 思想:0~9每个十进制数位至少用4位二进制位来表示
    2. 有权码和无权码
      1. 有权码:表示每个十进制数位的4个二进制数位(称基2码)都有一个确定的权,如8421码

      2. 无权码:表示每个十进制数位的4个基2码没有确定的权,如余3码和格雷码

        十进制数字 8421 余三码 格雷码
        0 0000 0011 0000
        1 0001 0100 0001
        2 0010 0101 0011
        3 0011 0110 0010
        4 0100 0111 0110
        5 0101 1000 1110
        6 0110 1001 1010
        7 0111 1010 1000
        8 1000 1011 1100
        9 1001 1100 0100

5. 字符数据的机器表示

  1. 7位\(ASCII\)
  2. 汉字以及国际字符编码:\(Unicode\)

6. 数据的度量和存储

  1. 数据的度量单位

    度量单位 缩写 存储二进制换算关系 描述计算机通信带宽的换算关系
    千字节 KB \(1KB=2^{10}bytes=1024B\) \(1KB=10^3bytes=1000B\)
    兆字节 MB \(1MB=2^{20}bytes=1024KB\) \(1MB=10^6bytes=1000KB\)
    千兆字节 GB \(1GB=2^{30}bytes=1024MB\) \(1GB=10^9bytes=1000MB\)
    兆兆字节 TB \(1TB=2^{40}bytes=1024GB\) \(1TB=10^{12}bytes=1000GB\)
  2. 数据的存储方式

    1. 大端方式:\(MSB\)最高有效位所在的地址是数的起始地址
    2. 小端方式:\(LSB\)最低有效位所在的地址是数的起始地址
  3. 数据对齐

    1. 按边界对齐(假定字的宽度为32位,存储器按字节编址)
      1. 字地址:4的倍数
      2. 半字地址:2的倍数
      3. 字节地址:任意等字节长度
    2. 不按边界对齐:存储更紧凑,但是会增加访存次数

7. 基本指令和指令类型

  1. 指令系统组成
    1. 数据传送指令:\(Move\)\(Store\)\(Load\)\(Exchange\)
    2. 算术运算指令:定点数,浮点数,十进制数字的运算
    3. 逻辑运算指令:\(And\)\(Or\)\(Not\)\(Xor\)\(Compare\)
    4. 输入输出指令:\(IN\)\(OUT\)
    5. 系统控制指令:启动IO设备,存取特殊寄存器指令等
    6. 程序控制指令:转移指令,循环控制指令,子程序调用以及返回,程序中断以及返回指令
  2. 使用子程序的优势
    1. 降低程序设计的复杂度
    2. 提高程序的可重用性
    3. 节省存储空间
    4. 是模块化程序设计的基础,子程序库

5. 程序的机器级表示

1. MIPS 指令系统介绍

  1. 指令长度:都是32位宽,按字地址对齐
  2. 三种指令格式
    1. R-Type:用于寄存器,两个操作数都是寄存器的运算指令

      字段 OP rs rt rd shamt funct
      含义 操作码 第一个源操作数寄存器 第二个操作数寄存器 结果寄存器 移位指令的位移量 功能码(op操作的特定变式)
      位数 6 5 5 5 5 6
    2. I-Type:一个寄存器,一个立即数

      字段 OP rs rt immediate
      含义 操作码 源操作数寄存器 结果寄存器 立即数或者偏移地址数
      位数 6 5 5 16
    3. J-Type:无条件跳转指令

      字段 OP Address
      含义 操作码 偏移地址
      位数 6 26
      • 无条件转移地址的低26位;将PC高4位拼上26位直接地址,最后添2个0, 就是32位目标地址

      J-Type 为什么要添加两个0(左移2位)

      J-Type 跳转到传递的目标。但是,由于指令集限制为32位,并且6个用于操作码,因此仅26个可以用于跳转目标。这意味着J-Type可以通过的距离受到限制;MIPS指令集可以这样定义:遇到J-Type时,将PC的高4位添加到J-Type的26位目标上,但是要注意的是,该指令是程序能跳的地址总是"字对齐的"。这意味着这些地址始终是4的倍数,因此地址的最后2位始终是0。这使我们可以不对跳转目标中的最后2位进行编码

  3. 指令类型
    1. 算术逻辑运算指令
    2. 数据传输指令
    3. 条件分支指令
    4. 无条件跳转指令
  4. 条件转移指令通常根据Condition Codes (条件码 / 状态位 / 标志位)进行转移
    1. 标志位:SF:负数标志; OF:溢出标志; CF:进位指令; ZF:零标志
    2. 设置 CFOF
      1. 设置CF标志时,运算结果被视为无符号数
      2. 设置OF标志时,运算结果被视为有符号数
      3. 区别
        1. 进/借位CF表示无符号数的运算结果是否超出范围,即使超出范围,如果保存进位或借位,运算结果仍然是正确的
        2. 溢出标志OF表示有符号数的运算结果是否超出范围,若超出范围,则运算结果不正确
posted @ 2022-10-16 11:32  RadiumStar  阅读(520)  评论(0编辑  收藏  举报