计算机如何执行程序

用可视化动画跟随 CPU 完成取指、解码、执行、写回的完整指令周期,理解程序计数器、寄存器、ALU 与内存如何协作。

入门 约 15 分钟 交互实验CPU指令周期寄存器ALU冯诺依曼

跟随步骤学习:播放动画、单步执行、点击左侧步骤随时跳转。

开始学习

点击 播放 或 下一步 开始。每一步动画都对应一条原理解释, 右侧面板展示来自模拟器的实时数据;学完动画后,页面底部有完整图文正文。

本教程目标: 理解「存储程序」架构:指令和数据同样放在内存里;掌握指令周期四阶段:取指 → 解码 → 执行 → 写回;理解程序计数器(PC)如何驱动指令顺序执行与跳转;能跟踪一条加法指令执行时寄存器与内存的变化。

图文正文ARTICLE

即使不播放动画,也可以通过以下内容理解本教程的知识点。

存储程序:指令也是数据

现代计算机遵循冯·诺依曼架构:程序以指令序列的形式和普通数据一样存放在内存中,CPU 依次取出来执行。这是「程序可以像数据一样被加载、复制、修改」的根源 —— 你安装一个软件,本质就是把它的指令写进存储介质,运行时再载入内存。

参与这个循环的核心部件:

  • 内存:存放指令与数据,每个单元有地址;
  • 程序计数器(PC):始终存着「下一条要执行的指令地址」;
  • 指令寄存器(IR):暂存当前正在处理的指令;
  • 通用寄存器:CPU 内部的快速存储单元,存放运算的操作数与结果;
  • ALU(算术逻辑单元):执行加减、与或、比较等运算;
  • 总线:地址、数据、控制在 CPU 与内存间传递信息。

指令周期:取指、解码、执行、写回

CPU 的工作就是不断重复一个循环:

① 取指(Fetch):把 PC 里的地址放到地址总线,从内存读出指令,存入 IR;同时 PC 自增,指向下一条指令(自增量取决于指令长度)。

② 解码(Decode):控制单元解析指令的二进制编码:高位的操作码(opcode)决定「做什么」(加、载、存、跳转),其余位指明操作数在哪些寄存器或内存地址。

③ 执行(Execute):ALU 完成计算,或按地址访问内存(读/写),或根据指令类型修改 PC(分支跳转)。

④ 写回(Writeback):把结果写回寄存器或内存。

一条「ADD R1, R2」(R1 += R2)指令会触发:取指 → 解码出「寄存器加法」→ ALU 读 R1、R2 相加 → 结果写回 R1。整个过程可能只花一个时钟周期,现代 CPU 每秒数十亿周期。

跳转:程序「有条件」的原因

顺序执行只是默认情况。分支与跳转指令直接修改 PC 的值:

  • 无条件跳转(JMP):PC ← 目标地址;
  • 条件分支(BEQ、JNE):根据 ALU 产生的标志位(是否为零、是否溢出、比较结果)决定改不改 PC。

if/else、循环、函数调用,编译后全部由这些指令实现。比如 while 循环就是「条件不满足时跳回循环体开头」的条件跳转;函数调用(call/ret)除了跳转还要保存返回地址。

标志位是理解条件执行的关键:SUB 之后若结果为零则 ZF=1,比较和判断由此而来 —— 这就是为什么汇编里常见「比较后跟条件跳转」的组合。

真实 CPU 的优化(教学简化说明)

本教程的动画展示的是经典教学模型。真实现代 CPU 还有大量加速机制,它们不改变指令语义,但让执行快得多:

  • 流水线:取指、解码、执行、写回像工厂流水线一样并行 —— 第 N 条指令执行时,第 N+1 条已在解码;
  • 缓存:CPU 缓存(L1/L2/L3)把热数据放在离寄存器更近的地方,弥补内存速度差;
  • 超标量与乱序执行:一个周期发射多条指令,并按数据依赖重排执行顺序;
  • 分支预测:提前猜测分支走向,猜错才回滚。

需要注意:这些优化引入了并发与乱序,是理解「为什么多线程需要内存屏障」等高级问题的入口。本站教程用最简模型呈现核心循环,不模拟流水线与乱序等细节。