ARM 3级流水线的PC值关系
在解释PC值关系之前先了解一些概念。
- 程序计数器(PC寄存器)
程序计数器是用于存放下一条指令所在单元的地方。当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。与此同时,PC中的地址自动加1,或者由转移指针给出下一条指令的地址。
- ARM系统
对于32位处理器,一条指令占据4字节。
- 流水线工作
流水线划分为取指,译码,执行。但并不是需3个时钟周期完成一条指令。因为取指,译码,执行,可以在通一个时钟周期中工作,互不影响,这样可以看出虽然一条指令完成需要多个时钟周期,但是总体来说看在每个时钟周期都有一条指令完成。
好,现在我们开始。
由程序计数器的概念我们可以知道,在PC寄存器中存放着各种指令地址,程序运行时PC指向的是正在被取指的指令,不是指向当前正在执行的指令!即:在执行一条指令时,PC指向的是下一条指令指令。由于ARM是三级流水线工作方式,在理想条件下,在取了一条指令后,等该指令到了执行阶段,处理器其实已经预取了往后的第二条指令了。
参考图1的竖着的椭圆(代表着一个流水线),当AND指令在执行时,PC值已经指向ADD的地址。ADD的指令在AND后的第二条指令。
所以有着下列数量关系:
PC→F(ADD的地址)
E(当前AND的执行地址)+8 (因为落后两条指令 2*4=8)= F (ADD的地址)
根据上述流水线的机制,我们的处理器执行的指令是落后于要预取的指令地址,落后两个时钟周期。对于32位处理器而言,也就是:
PC值=当前指令地址(E)+8
图2是对图1中竖着的椭圆的更详细的描述。
PC=F(当前预取的指令地址)
D=PC-4 (译码地址落后预取的地址1个周期)
E=PC-8(执行地址落后预取的地址两个周期)
正是由于三级流水,使用BL XXX跳转到函数XXX之前,会把PC-4放入LR寄存器中,PC-4是当前执行指令的下一条指令,函数XXX的末尾执行BX LR(相当于 MOV PC, LR)就回到下一条指令执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
2017-12-10 __attribute__ --- 给函数设置别名
2017-12-10 GCC、GNU C、C99、ANSI C