在解释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(执行地址落后预取的地址两个周期)
标签:ARM3,PC,地址,指令,预取,流水线,执行 From: https://www.cnblogs.com/god-of-death/p/16971641.html