为啥是“PC = PC + 8”;

“PC = PC + 8”其实这样写容易让人蒙了。“PC = PC + 8”真正含义应该是:

执行处代码地址 = PC - 8;

也就是说,”PC指向的地址“领先“执行处代码地址”8个字节;

也就是说“PC = PC + 8”中的第二个PC,其实表示是“执行处代码地址”

然后,理解为啥是8?

首先,arm的地址宽度是4个字节,所以每执行一条指令,PC就会自加4.

而一条指令要完全被arm吸收,需要多个步骤,拿arm7举例它采用了3级流水线技术。

流水线,对于我们这种玩FPGA的再熟悉不过了,以3级流水线来说,就是把一件事情分成3个步骤,每个步骤同时处理,

前两个周期为潜伏期,无法出结果,之后结果会源源不断的输出。

想象一下,一条条指令,就像一个个等待加工的产品,奔跑在传送带上,而“FETCH”,“DECODE”,“EXECUTE”,就是3道加工工序。

1、在第一个周期,PC指向第一条程序指令,进行取值(FETCH),DECODE,和EXECUTE步骤“扑空”

2、在第二个周期,接着PC + 4,PC指向第二条程序指令进行取值(FETCH),DECODE处理了在一个周期,FETCH到的指令,EXECUTE再次扑空。

3、在第三个周期,依然PC + 4,PC指向第三条程序指令进行取值(FETCH),DECODE处理了在二个周期,FETCH到的指令,

EXECUTE这时,处理在一个周期FETCH到的指令,这个指令同时也就是在第二个周期DECODE的指令。

4、之后每个时钟周期,EXECUTE都能处理到经过两次加工的code,不过PC始终领先于它,也就是:执行处代码地址 = PC - 8;

而ARM9通过增加流水线级数,简化了流水线的各级逻辑,进一步提高了处理器的性能。采用5级流水线技术,但是同样是“PC = PC + 8”,

这是为什么呢?我们来看看图:

我们发现EXECUTE仍然在第三个步骤,及符合:执行处代码地址 = PC - 8;只要理解这一点阅读代码也就够了。

——宋桓公

2015-05-11

ARM你必须知道的事儿——为啥“PC = PC + 8”?的更多相关文章

  1. ARM获得PC指针为何PC=PC+8

    http://blog.csdn.net/sddzycnqjn/article/details/7691534 R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指 ...

  2. 从MOV PC,PC;(或者ADDPC,PC,#4 )看ARM的三级流水线过程

    3级流水线如上图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行. ⑴ 取指从存储器装载一条指令 ⑵ 译码识别将要被执行的指令 ⑶ 执行处理指令并将结果写会寄存器 以前学过的51单 ...

  3. ARM 开发板嵌入式linux系统与主机PC通过串口传输文件

    本文转载自http://useless20.blog.163.com/blog/static/237409982010227127576/ 嵌入式linux系统与主机通过串口传输文件 我想如果要从PC ...

  4. 移动端转PC --> PC跳转移动端

    <script type=”text/javascript”>try {var urlhash = window.location.hash;if (!urlhash.match(“fro ...

  5. web前端工程师在移动互联网时代里的地位问题 为啥C/S系统在PC端没有流行起来,却在移动互联网下流行了起来 为啥移动端的浏览器在很多应用里都是靠边站,人们更加倾向于先麻烦自己一下,下载安装个客户端APP

    web前端工程师在移动互联网时代里的地位问题 支付宝十周年推出了一个新产品:支付宝的十年账单,我也赶个时髦查看了一下我的支付宝十年账单,哎,感慨自己真是太屌丝了,不过这只是说明我使用淘宝少了,当我大规 ...

  6. 关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.                                                 ...

  7. ARM处理器的寄存器

    在ARM体系中通常有以下3种方式控制程序的执行流程: **在正常执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节:每执行一条Thumb指令,程序计数器寄存器(PC)加2个字节.整个过 ...

  8. ARM 汇编的一些规范

    A.5.1  文件格式        ARM 源程序文件(即源文件)为文件格式,可以使用任一文本编辑器编写程序代码.         在一个项目中,至少要有一个汇编源文件或C 程序文件,可以有多个汇编 ...

  9. ARM指令集(上)

    ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1  指令格式         (1)基本格式       ...

随机推荐

  1. Deep Learning(深度学习)学习笔记整理系列之(五)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  2. 剑指 offer set 1 二维数组中查找

    总结 1. 二维数组搜索题遇到两个了, 一个是 Leetcode 上 search in 2D matrix. 那道题比较简单, 因为下一行的所有元素大于上一行的. 这道题对二维矩阵的要求比较松, 起 ...

  3. oc-15-匿名对象

    /** 匿名对象 1.访问成员变量--->只能给成员变量设置值,只能成功1次,每次都是新的对象. 2.调用方法时类似类方法: 跟类方法区别:匿名对象创建对象了,开辟空间了. */ #import ...

  4. IPC——消息队列

    Linux进程间通信——使用消息队列 下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管 ...

  5. HDOJ 1301 Jungle Roads

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301 //HDOJ1301 #include<iostream>#include<c ...

  6. android studio无法更新之解决方案

    当发现android studio有更新时,当然第一时间就想更新,可惜被墙了. 解决方案: 下载wallproxy,百度你懂的 在proxy.ini中最上面,找到ip和port 接着,在android ...

  7. Working with MTD Devices

    转:http://www.linuxforu.com/2012/01/working-with-mtd-devices/ Working with MTD Devices By Mohan Lal J ...

  8. C. Om Nom and Candies 巧妙优化枚举,将复杂度控制在10e6

    C. Om Nom and Candies 无线超大背包问题 #include <iostream> #include <cstdio> #include <cstrin ...

  9. IOS 图片转换二进制 二进制转换为图片

    //类方法 图片 转换为二进制 +(NSData *)Image_TransForm_Data:(UIImage *)image { NSData *imageData = UIImageJPEGRe ...

  10. Swift 2.0学习

    前几天在苹果官方文档学习iOS9 3D Touch的时候,发现苹果关于3D Touch的smaple code,竟然是用Swift语法写的,并且根本没有OC版本的. 看来学习Swift语法是势在必行了 ...