第2章 指令系统原理与示例

1.指令集系统结构的分类:指令集系统的不同结构

根据课件内容,指令集系统结构(Instruction Set Architecture, ISA) 的分类可以根据处理器内部数据的存储类型操作数访问方式进行划分。


1. 根据处理器内部数据存储类型分类

指令集系统结构的最根本区别在于处理器内部数据的存储类型,主要分为以下三类:

(1) 堆栈系统结构(Stack Architecture)

  • 特点
    • 操作数隐含地位于栈顶,不需要显式指定。
    • 操作数通过 pushpop 指令进行堆栈操作。
  • 优点
    • 指令长度较短(因为操作数隐含)。
  • 缺点
    • 数据操作效率较低,需要频繁的堆栈存取。
    • 操作顺序受到栈顶限制(无法乱序操作)。

(2) 累加器系统结构(Accumulator Architecture)

  • 特点
    • 一个操作数隐含在累加器中,另一个操作数需要显式指定。
    • 计算结果存储在累加器中。
  • 优点
    • 指令长度较短。
    • 简单易实现,适用于早期计算机。
  • 缺点
    • 累加器的内容需要频繁存取内存,导致效率低。

(3) 通用寄存器系统结构(General Purpose Register, GPR Architecture)

  • 特点
    • 操作数存储在一组寄存器中,所有操作数需要显式指定。
    • 通过 loadstore 指令访问内存。
  • 优点
    • 数据访问效率高,寄存器访问速度快于内存。
    • 灵活性强,可以随机访问寄存器中的任意数据。
  • 缺点
    • 指令长度较长,需要显式指定寄存器。

image-20241218102324813image-20241218102340856


2. 根据寄存器与存储器的操作模式分类

在通用寄存器结构的基础上,还可以根据寄存器与存储器的访问方式进一步分类:

(1) 寄存器-存储器系统(Register-Memory Architecture)

  • 特点
    • 指令可以直接访问存储器中的数据,也可以访问寄存器中的数据。
    • 一部分操作数可以在内存中,另一部分可以在寄存器中。
  • 优点
    • 减少了 loadstore 指令的数量,指令更简洁。
  • 缺点
    • 存储器访问速度较慢,影响性能。
  • 示例:Intel 8086。

(2) 寄存器-寄存器系统(Register-Register Architecture,也称 Load-Store Architecture)

  • 特点
    • 所有运算操作数必须从内存加载到寄存器中。
    • 通过 load 指令将数据从内存加载到寄存器,通过 store 指令将寄存器数据存回内存。
  • 优点
    • 存储器操作与计算操作分离,有利于流水线设计。
    • 寄存器的使用频率高,数据访问速度快。
  • 缺点
    • 需要更多的 loadstore 指令,代码量较大。
  • 示例:MIPS、ARM。

(3) 存储器-存储器系统(Memory-Memory Architecture)

  • 特点
    • 指令的所有操作数都可以直接存储在存储器中。
    • 不需要专门的寄存器。
  • 优点
    • 指令长度较短,不需要显式指定寄存器。
  • 缺点
    • 存储器访问频繁,性能较低。
    • 实际上几乎不存在这种系统结构。
  • 示例:理论模型,实际中几乎不采用。

3. 示例:不同系统结构对操作的实现

假设有一个简单的计算任务 (C = A + B),且 (A)、(B)、(C) 都存储在存储器中,以下是三种系统结构的实现方式:

image-20241218102522846image-20241218102539367

(1) 堆栈结构(Stack Architecture)

1
2
3
4
PUSH A      // 将 A 压入堆栈
PUSH B // 将 B 压入堆栈
ADD // 弹出栈顶两个操作数相加,将结果压入栈顶
POP C // 将结果存入 C

(2) 累加器结构(Accumulator Architecture)

1
2
3
LOAD A      // 将 A 加载到累加器中
ADD B // 累加器中的值加上 B,结果存入累加器
STORE C // 将累加器中的结果存入 C

(3) 通用寄存器结构(General Purpose Register Architecture)

  • 寄存器-存储器系统:
    1
    2
    3
    LOAD R1, A  // 将 A 加载到寄存器 R1 中
    ADD R1, B // R1 的值加上 B,结果存入 R1
    STORE C, R1 // 将 R1 中的结果存入 C
  • 寄存器-寄存器系统:
    1
    2
    3
    4
    LOAD R1, A  // 将 A 加载到寄存器 R1 中
    LOAD R2, B // 将 B 加载到寄存器 R2 中
    ADD R3, R1, R2 // R1 和 R2 相加,结果存入 R3
    STORE C, R3 // 将 R3 中的结果存入 C

4. 通用寄存器结构的扩展

在通用寄存器系统中,根据指令集设计,还存在一些扩展类型:

  1. 扩展累加器计算机

    • 累加器外增加多个寄存器。
    • 提升灵活性和性能。
  2. 寄存器-寄存器系统中的 ALU 指令特性

    • 包含两个操作数(源操作数)和一个结果(目的操作数)。
    • 操作数可以是 0~3 个寄存器或存储器操作数。

5. 设计原则与现代趋势

  1. 寄存器比存储器快
    • 寄存器存储的数据访问速度快于存储器,现代设计更多使用寄存器。
  2. 编译器效率
    • 通用寄存器结构适合现代编译器优化,可以提高代码效率和运行速度。
  3. 流水线与并行化
    • 寄存器-寄存器系统的 Load-Store 模式有利于流水线实现,是现代 RISC 架构的基础。

image-20241218103538093

2.存储器寻址:大小端模式及地址对齐

image-20241218103923218

小端模式的优势:便于计算地址偏移。例如,数据的最低字节总是存储在起始地址,直接操作低地址即可。

大端模式的优势:更接近人类阅读习惯,便于调试与观察。


地址对齐指的是存储器中数据的地址必须是特定字节大小的整数倍,从而提高硬件访问效率。

(1) 对齐的定义

如果一个大小为 ( s ) 字节的数据存储在地址 ( A ),并且满足:

则称该地址为对齐的地址

image-20241218104334410

(2) 对齐的优点

  1. 简化硬件设计:对齐的访问可以直接在一条存储器操作中完成,而不需要多次访问。
  2. 提高访问效率:非对齐数据需要分两次(或更多次)读取,增加了访问开销。

image-20241218104733938

3.MIPS系统结构:MIPS指令集结构

MIPS指令集结构

MIPS(Microprocessor without Interlocked Pipeline Stages)是一个经典的RISC(精简指令集计算机)架构,强调简单性和高效性,适用于流水线设计和编译器优化。以下是关于MIPS指令集结构的详细介绍:


1. MIPS指令集的主要特点

  1. 固定长度指令编码
    • 每条指令的长度为 32 位
    • 指令格式统一,便于流水线操作和硬件译码。
  2. 精简指令集
    • 指令集数量少,指令功能简单。
    • 所有复杂的功能通过软件组合多条简单指令实现。
  3. 寄存器-寄存器结构(Load/Store架构)
    • 只有 loadstore 指令访问存储器。
    • 其他运算指令的操作数都来自寄存器。
  4. 通用寄存器
    • 提供 32 个 32 位的通用寄存器(R0 ~ R31),用于数据操作。
    • R0 的值始终为 0,用于常数操作。
  5. 面向流水线设计
    • 每条指令占用流水线的一个阶段,充分利用硬件资源。

2. MIPS指令格式

MIPS指令分为三种格式:

  1. R型指令(Register)

    • 用于寄存器之间的算术、逻辑和移位操作。
    • 格式:

      • op:操作码,决定指令类型。
      • rs:源寄存器1。
      • rt:源寄存器2。
      • rd:目标寄存器。
      • shamt:移位操作中用于指定移位位数。
      • funct:功能码,用于进一步区分指令。

      示例:加法指令 add rd, rs, rt

      • 功能:将 rsrt 寄存器的值相加,结果存入 rd
  2. I型指令(Immediate)

    • 用于立即数运算、加载和存储操作,以及分支指令。
    • 格式:

      • immediate:16 位立即数。

      示例addi rt, rs, immediate

      • 功能:将 rs 寄存器的值与 immediate 相加,结果存入 rt
  3. J型指令(Jump)

    • 用于跳转指令。
    • 格式:

      • address:目标地址。

      示例j address

      • 功能:跳转到 address 指定的地址。

3. MIPS指令类型

MIPS指令按照功能分为以下几类:

(1) 数据传输指令

  • Load 指令
    • 从内存中加载数据到寄存器。
    • 示例:lw rt, offset(rs)
      • 功能:将存储器地址 rs + offset 中的数据加载到寄存器 rt
  • Store 指令
    • 将寄存器数据存储到内存。
    • 示例:sw rt, offset(rs)
      • 功能:将寄存器 rt 的数据存储到地址 rs + offset

(2) 算术与逻辑指令

  • 算术指令
    • 加法:add rd, rs, rt(寄存器加法)
      • 功能:将 rsrt 的值相加,结果存入 rd
    • 加立即数:addi rt, rs, immediate
      • 功能:将 rsimmediate 相加,结果存入 rt
    • 减法:sub rd, rs, rt
      • 功能:将 rs 减去 rt,结果存入 rd
  • 逻辑指令
    • 与:and rd, rs, rt
    • 或:or rd, rs, rt
    • 异或:xor rd, rs, rt

(3) 移位指令

  • 左移:sll rd, rt, shamt
    • 功能:将 rt 左移 shamt 位,结果存入 rd
  • 右移:srl rd, rt, shamt
    • 功能:将 rt 逻辑右移 shamt 位,结果存入 rd

(4) 分支与跳转指令

  • 条件分支
    • beq rs, rt, offset:若 rs == rt,跳转到 PC + offset
    • bne rs, rt, offset:若 rs != rt,跳转到 PC + offset
  • 无条件跳转
    • j address:跳转到指定地址。
    • jal address:跳转到指定地址,并保存返回地址到寄存器 $ra

(5) 浮点操作指令

  • 单精度浮点加法:add.s fd, fs, ft
    • 功能:将浮点寄存器 fsft 相加,结果存入 fd
  • 单精度浮点乘法:mul.s fd, fs, ft

4. MIPS的寄存器组织

MIPS指令集架构提供以下寄存器:

  1. 32 个通用寄存器(GPRs, General Purpose Registers)
    • 例如:$t0 ~ $t9(临时寄存器),$s0 ~ $s7(保存寄存器)。
    • $zero:值始终为 0。
    • $ra:保存返回地址。
    • $sp:堆栈指针。
  2. 32 个浮点寄存器
    • 用于浮点数运算。

5. MIPS寻址模式

MIPS支持以下几种寻址方式:

  1. 立即数寻址
    • 操作数直接包含在指令中。
    • 示例:addi $t0, $t1, 5(将 5 加到 $t1 中)。
  2. 寄存器寻址
    • 操作数存储在寄存器中。
    • 示例:add $t0, $t1, $t2
  3. 基址寻址
    • 使用寄存器值作为基地址,加上偏移量获得操作数地址。
    • 示例:lw $t0, 4($t1)
  4. PC 相对寻址
    • 基于程序计数器(PC)的偏移量指定目标地址。
    • 示例:beq $t0, $t1, offset
  5. 伪直接寻址
    • 用于跳转指令,目标地址由指令中 26 位地址和当前 PC 拼接计算。
    • 示例:j address

6. MIPS的优缺点

优点:

  • 简单性:指令设计简单,便于硬件实现和流水线优化。
  • 固定长度指令:简化了硬件的指令译码和控制。
  • 寄存器使用高效:编译器可以灵活分配寄存器,提高性能。
  • 适合嵌入式应用:代码量小、运行效率高。

缺点:

  • 代码密度低:由于固定长度指令,某些复杂操作需要多条指令完成。
  • 内存操作限制:仅能通过 loadstore 指令访问存储器。

7. 总结

MIPS指令集结构以简单、高效为核心,采用固定长度指令和 Load/Store 架构,便于流水线优化和硬件实现。其简单性和灵活性使得 MIPS 在教学和嵌入式系统中得到广泛应用。