流水线与 PC
2026/9/28大约 2 分钟
Cortex-M 为什么读取 PC 是当前地址 + 4?——流水线与 PC
1. 先记结论
address:
<--------------
取指 译码 执行PC的定义是“下一条要执行(取指)的指令地址”,由于流水线的存在,它永远超前于“当前正在执行”的指令地址。顺序执行时,取指地址是高地址,执行地址是低地址
在 Cortex-M3/M4 的 Thumb/Thumb-2 状态下:
mov r0, pc读取到的 PC 值通常为:
当前指令地址 + 4验证

可以看见当前执行的这个指令地址是446,而这个时候呢,PC的值是44a比当前正在执行的地址多4,也就是对应取指的地址,
2. 那流水线到底起什么作用?
Cortex-M3 使用三级流水线:

取指 → 译码 → 执行CPU 在执行当前指令时,取指阶段已经在处理后续指令,因此 PC 的概念本身就不是简单的:
PC = 当前正在执行的指令地址ARM 架构为了配合这种取指模型,对读取 PC 的结果规定了特定语义。
对于 Thumb 指令,读取 PC 时通常得到:
当前指令地址 + 4因为Thumb 16位指令,PC取指和当前执行呢,差了两个,也就是4个字节
3. 一个容易踩的坑
看到:
mov r0, pc不要理解成:
r0 = 当前指令地址也不要理解成:
r0 = 下一条指令地址正确理解:
r0 = 按ARM架构定义读取到的PC值
≈ 当前指令地址 + 44. 最终记忆
流水线 → PC具有提前取指的架构背景
↓
PC ≠ 简单的当前指令地址
↓
ARM架构定义PC读取语义
↓
三级流水线地址依次递减,PC指向高地址取指指令
