在解释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)就回到下一条指令执行
今天的文章ARM3级流水线的PC值关系分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/46301.html