CPU 是计算机的运算与指挥中心。本文整理 CPU 的三大组成部件(运算器、控制器、寄存器组)、指令的执行过程,以及指令集架构(ISA)与 RISC/CISC 的权衡。
CPU 内部主要由三部分构成:
CPU 三大部件与总线的协作关系:
一条指令的执行分取指 → 译码 → 执行 → 写回四个阶段:
这即冯·诺依曼的取指-执行循环(Instruction Cycle),每个循环完成一条指令:
一条指令包含两个部分:
指令长度分定长(固定字节)与变长(按操作码/寻址方式变化)。x86 是变长指令,RISC 多定长指令。
指令如何找到操作数,即寻址方式(Addressing Mode):
| 方式 | 说明 | 示例 |
|---|---|---|
| 立即寻址 | 操作数就在指令中 | MOV R1, #5 |
| 直接寻址 | 指令给出内存地址 | LOAD R1, [1000] |
| 间接寻址 | 指令给出存放地址的地址 | LOAD R1, [[1000]] |
| 寄存器寻址 | 操作数在寄存器 | ADD R1, R2 |
| 寄存器间接 | 寄存器内存放的是地址 | LOAD R1, [R2] |
| 变址/基址寻址 | 基址 + 偏移量 | LOAD R1, [R2 + 4](数组访问) |
寻址方式越丰富,指令越灵活,但译码越复杂。RISC 通常只保留少量简单寻址方式。
指令集架构(ISA) 是 CPU 对外提供的指令集合规范,是软件与硬件之间的接口约定。汇编器/编译器面向 ISA 生成指令,硬件按 ISA 执行。
主要分两大流派:
| 维度 | CISC(x86) | RISC(ARM) |
|---|---|---|
| 指令长度 | 变长 | 定长 |
| 内存访问 | 运算可直接访问内存 | 仅 Load/Store 访问 |
| 寄存器数量 | 较少 | 较多 |
| 功耗 | 高 | 低 |
| 代表 | 桌面/服务器 | 移动端/嵌入式 |
现代 x86 处理器内部实际把 x86 指令微码翻译成类似 RISC 的微操作执行,兼得兼容性与性能,称为微架构与 ISA 分离。
RISC 风格的一条加法,需三步(体现 Load/Store 原则):
LOAD R1, [a] ; 从内存 a 加载到 R1
LOAD R2, [b] ; 从内存 b 加载到 R2
ADD R3, R1, R2; 寄存器相加,结果存 R3
STORE [c], R3 ; 结果写回内存 c运算指令只操作寄存器,内存访问由专门指令负责,极大简化译码与流水线。