从MOV PC,PC;(或者ADDPC,PC,#4 )看ARM的三级流水线过程
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] view plaincopyprint?
0x4000 ADDPC,PC,#4 ;正在被执行的指令,将地址值PC+4写入PC
0x4004 ...;正在被译码的指令
0x4008 ...;正在被取指的指令,PC=0x4008
0x400C ...;PC+4=0x400C
另外补充说明就是根据以上描述,流水线只有被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅单周期指令)。如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线被再次填满。因此,尽量地少使用跳转指令可以提高程序的执行效率这样你就知道了,如果返回的时候返回PC,那么中间就有一个指令没有执行,所以用SUB pclr-irq #4。
从MOV PC,PC;(或者ADDPC,PC,#4 )看ARM的三级流水线过程的更多相关文章
- Windows 8下完美使用Virtual PC 2007(virtual pc 2007 64 win8 兼容性)
Windows 8下完美使用Virtual PC 2007(virtual pc 2007 64 win8 兼容性) 一.从微软的官方网站下载Virtual PC 2007 SP1英文版,文件名为se ...
- ARM中的PC和AXD的PC
R15 (PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令.一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC 总是指向第三条指令 ...
- PC端轻松控制Android手机,PC Control Andoroid,PC控制安卓手机
记录此次经历的目的是帮助需要的人或下次使用时少走弯路,我为此试用了不少工具及方法,因为追求免费,像"Weak Control:在PC上控制你的Android手机"还要收费的我就不弄 ...
- 关于每次取PC的值为PC+4的问题
关于ARM的书上常说由于流水线特性,在指令执行期间读取程序计数器时,读出的值需要为当前指令+4 一开始总是不理解,今天被一位大神一语道破其中精髓.... 程序计数器(PC)总是指向“正在取指”的指令 ...
- pc版qq登录及移动版qq登录的申请过程
1.在哪里接入? 网站接入QQ登录在QQ互联(https://connect.qq.com)上创建:移动应用也可以在QQ互联(https://connect.qq.com)上创建,但是不推荐如此 ...
- PC下ubuntu查找PC串口并加入用户组
1. 查看ttyS0隶属的组:ls -l /dev/ttyS0 //发现隶属于dialout组 输出: crw-rw---- 1 root dialout 4, 64 9月 9 08:23 /d ...
- ARM系列产品
ARM7系列 ARM9系列 ARM9E系列 ARM10E系列 SecurCore系列 Intel的StrongARM ARM11系列 Intel的Xscale 其中,ARM7.ARM9.ARM9E和A ...
- ARM异常中断返回的几种情况
在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下: 重要基础知识:R15(PC)总是 ...
- 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 百篇博客分析OpenHarmony源码 | v5.05
百篇博客系列篇.本篇为: v05.xx 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...
随机推荐
- sklearn线性回归实现房价预测模型
目录 题目要求 单特征线性回归 方案一 方案二 多特征线性回归 两份数据 ex1data1.txt ex1data2.txt 题目要求 建立房价预测模型:利用ex1data1.txt(单特征)和ex1 ...
- ubuntu下编辑文本命令
常见的基于控制台的文本编辑器有以下几种: emacs 综合性的GNU emacs 编辑环境 nano 一个类似于经典的pico的文本编辑器,内置了一个pi ...
- js获取文件后缀名
function extname(filename){ if(!filename||typeof filename!='string'){ return false }; let a = filena ...
- Windows Dialog对话框
一.MessageBox弹出框 MessageBox.Show(<字符串> Text, <字符串> Title, <整型> nType,MessageBoxIcon ...
- mysql对两个字段进行自定义排序
Mysql order by 多字段排序 ') desc,ADD_DATE desc mysql单个字段降序排序: select * from table order by id desc; mysq ...
- nginx location if 的匹配规则
cation匹配命令 ~ #波浪线表示执行一个正则匹配,区分大小写~* #表示执行一个正则匹配,不区分大小写^~ #^~表示普通字符匹配,不是正则匹配.如果该选项匹配,只匹配该选 ...
- [Google Guava] 3-缓存
原文地址 译文地址 译者:许巧辉 校对:沈义扬 范例 01 LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() ...
- Vue引入非npm的js库
Vue引入非npm的js库 Vue项目有时候需要一些没有export的js库,不能通过import引入,那么使用方法如下 1.可以在index.html页面使用script标签引入,当然也可以使用cd ...
- 11、组件注册-使用FactoryBean注册组件
11.组件注册-使用FactoryBean注册组件 package org.springframework.beans.factory; import org.springframework.lang ...
- springmvc集成webService需要的jar包