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

指令集架构(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如何工作。
-
取指:
- 动作: 将程序计数器(PC) 指向的内存地址的内容读入指令寄存器(IR)。
- 硬件: 内存总线,PC寄存器。
- 意义: PC是“我们执行到哪了”的状态。这一步是自动的,由时钟驱动。
-
译码:
- 动作: 解析IR中的指令,识别操作码(这是什么指令?)和操作数(操作哪些寄存器?内存地址是什么?)。
- 硬件: 控制逻辑 的开始。指令位被输入到一个巨大的组合逻辑中,这个逻辑会根据操作码生成控制信号。
-
执行:
- 动作: 根据译码阶段产生的控制信号,操作数据通路。
- 硬件: 这是所有部件协同工作的舞台!
- ALU: 执行计算。
- 寄存器文件: 被读取或写入。
- 内存: 被加载或存储。
- PC: 被更新为下一条指令的地址(PC+1)或分支/跳转的目标地址。
对系统开发者的关键启示
-
控制逻辑是“灵魂”: LC-3的微架构图清晰地展示了,指令的每一位都像一只手指,拨动着数据通路上的开关(多路选择器)和控制线(ALU操作、寄存器写使能)。这让你直观地看到,你写的C代码编译成的机器码,是如何直接配置和驱动硬件电路的。
-
中断与异常: LC-3引入了中断的概念。虽然其机制比RISC-V的CSR寄存器组简单得多,但它包含了所有必要环节:
- 保存现场: 将PC和PSR压入栈。
- 跳转到处理程序: 加载中断服务例程的地址。
- 恢复现场: 执行
RTI指令返回。 - 启示: 这是理解操作系统接管硬件、实现多任务和系统调用的第一步。
-
内存映射I/O: LC-3的键盘和显示器都是通过特定的内存地址(如
0xFE00)来访问的。向这个地址“存储”就是在输出,从这个地址“加载”就是在读输入。- 启示: 这消除了I/O操作的神秘感。它让你明白,
printf底层最终不过是一次到特定内存地址的ST指令。这是理解驱动程序和硬件交互的基础。
- 启示: 这消除了I/O操作的神秘感。它让你明白,