跳转至

LC-3

LC-3简介

  • 极简指令集: LC-3只有16条基本指令,但它“麻雀虽小,五脏俱全”,包含了数据处理、控制流、内存访问和I/O操作。
  • 统一的指令格式: LC-3指令是固定长度的(16位),并且有规整的字段布局,这极大地简化了控制逻辑的设计。这是理解CPU工作的关键。
  • 少量的寄存器组: 8个通用寄存器(R0-R7),以及几个特殊寄存器(如PC, PSR)。这让你立刻理解为何编译器需要做寄存器分配,以及为什么会有“寄存器溢出”到内存的概念。

LC-3

指令集架构(ISA)

类别 LC-3示例 核心作用 系统视角
数据处理 ADD, AND, NOT 在寄存器上执行算术和逻辑运算。 ALU的驱动力。指令的操作码直接映射到ALU的控制信号。
数据传送 LD, ST, LDI, STI 内存寄存器之间移动数据。 揭示内存访问机制。理解地址计算、加载/存储延迟。LDI/STI(间接寻址)让你理解“指针”的硬件本质。
控制流 BR (条件分支)
JMP/RET (无条件跳转)
改变程序执行流。 程序计数器(PC)的控制器BR依赖于条件码(NZP),这直接对应了RISC-V的beq bne等指令。RET是子程序返回的硬件原语。
子程序调用 JSR/JSRR 调用函数,保存返回地址。 链接(Linking)机制的雏形。将返回地址存入R7(类似RISC-V的ra寄存器),实现了函数调用的最核心契约。

核心概念

这是LC-3(以及所有现代CPU)的心跳。理解了它,就理解了CPU如何工作。

  1. 取指:

    • 动作:程序计数器(PC) 指向的内存地址的内容读入指令寄存器(IR)
    • 硬件: 内存总线,PC寄存器。
    • 意义: PC是“我们执行到哪了”的状态。这一步是自动的,由时钟驱动。
  2. 译码:

    • 动作: 解析IR中的指令,识别操作码(这是什么指令?)和操作数(操作哪些寄存器?内存地址是什么?)。
    • 硬件: 控制逻辑 的开始。指令位被输入到一个巨大的组合逻辑中,这个逻辑会根据操作码生成控制信号。
  3. 执行:

    • 动作: 根据译码阶段产生的控制信号,操作数据通路
    • 硬件: 这是所有部件协同工作的舞台!
      • ALU: 执行计算。
      • 寄存器文件: 被读取或写入。
      • 内存: 被加载或存储。
      • PC: 被更新为下一条指令的地址(PC+1)或分支/跳转的目标地址。

对系统开发者的关键启示

  1. 控制逻辑是“灵魂”: LC-3的微架构图清晰地展示了,指令的每一位都像一只手指,拨动着数据通路上的开关(多路选择器)和控制线(ALU操作、寄存器写使能)。这让你直观地看到,你写的C代码编译成的机器码,是如何直接配置和驱动硬件电路的。

  2. 中断与异常: LC-3引入了中断的概念。虽然其机制比RISC-V的CSR寄存器组简单得多,但它包含了所有必要环节:

    • 保存现场: 将PC和PSR压入栈。
    • 跳转到处理程序: 加载中断服务例程的地址。
    • 恢复现场: 执行RTI指令返回。
    • 启示: 这是理解操作系统接管硬件、实现多任务和系统调用的第一步
  3. 内存映射I/O: LC-3的键盘和显示器都是通过特定的内存地址(如0xFE00)来访问的。向这个地址“存储”就是在输出,从这个地址“加载”就是在读输入。

    • 启示: 这消除了I/O操作的神秘感。它让你明白,printf底层最终不过是一次到特定内存地址的ST指令。这是理解驱动程序和硬件交互的基础。