找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1686|回复: 0
打印 上一主题 下一主题
收起左侧

从MOV PC,PC;看ARM的三级流水线过程

[复制链接]
跳转到指定楼层
楼主
ID:105323 发表于 2016-3-4 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
乍看这个指令好像是NOP;实际上远远不是,他实现的功能是跳转到当前指令下面第二条指令处执行
原因是PC寄存器中存储的是当前指令的地址+8,当人为改变PC寄存器的值之后,程序会跳转执行,这样,这条命令之后,假设这条命令的地址为X,那么PC在执行这条命令之后为X+8,
之后周期开始fetch X+8,
下一个周期开始decode X+8同时fetch X+12,
再一个周期开始excute X+8,同时decode X+12,同时fetch X+16,
这时候PC的值已经变成X+16, 也就是正在执行的X+8再加上8,如此继续。。。
实现同样目的的还有 ADD PC,PC,#0;当然B PC也可以,但是没有前者来的快速。
请高手看看这样理解是否正确?
+======以下为转载==========
看到汇编中很多关于程序返回与中断返回时处理地址都很特别,仔细想想原来是流水线作用的效果。所以,决定总结学习下ARM流水线。
ARM7处理器采用3级流水线来增加处理器指令流的速度,能提供0.9MIPS/MHz的指令处理速度。
PS:
MIPS(Million Instruction PerSecond)表示每秒多少百万条指令。比如0.9MIPS,表示每秒九十万条指令。
MIPS/MHz表示CPU在每MHz的运行速度下可以执行多少个MIPS,如0.9MIPS/MHz则表示如果CPU运行在1MHz的频率下,每秒可执行90万条指令。
如果CPU在20MHz的频率下,每秒可运行1800万条指令。MIPS/MHz可以很好的反映CPU的速度。

3级流水线如上图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行。
⑴ 取指从存储器装载一条指令
⑵ 译码识别将要被执行的指令
⑶ 执行处理指令并将结果写会寄存器
以前学过的51单片机,因为比较简单,所以它的处理器只能完成一条指令的读取和执行后,才会执行下一条指令。这样,PC始终指向的正在“执行”的指令。
而对于ARM7来说因为是3级流水线,所以把指令的处理分为了上面所述的3个阶段。
所以处理时实际是这样的:ARM正在执行第1条指令的同时对第2条指令进行译码,并将第3条指令从存储器中取出。
所以,ARM7流水线只有在取第4条指令时,第1条指令才算完成执行。
下图生动形象的说明了3级流水线的处理机制

下面一句话很关键:无论处理器处于何种状态,程序计数器R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或者正在“译码”的指令。
人们一般会习惯性的将正在执行的指令作为参考点,即当前第1条指令。
所以,PC总是指向第3条指令,
或者说PC总是指向当前正在执行的指令地址再加2条指令的地址。


处理器处于ARM状态时,每条指令为4个字节,所以PC值为正在执行的指令地址加8字节,即是:
PC值 = 当前程序执行位置 + 8字节
处理器处于Thumb状态时,每条指令为2字节,所以PC值为正在执行的指令地址加4字节,即是:
PC值 = 当前程序执行位置 + 4字节
下面一个例子就很好的说明了这个问题。
[plain] viewplaincopyprint?

  • 0x4000 ADDPC,PC,#4;正在被执行的指令,将地址值PC+4写入PC
  • 0x4004 ...;正在被译码的指令
  • 0x4008...;正在被取指的指令,PC=0x4008
  • 0x400C ...;PC+4=0x400C

另外补充说明就是根据以上描述,流水线只有被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅单周期指令)。
如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线被再次填满。因此,尽量地少使用跳转指令可以提高程序的执行效率
   这样你就知道了,如果返回的时候返回PC,那么中间就有一个指令没有执行,所以用SUB pclr-irq #4。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表