1: ARM采用的是3级流水线

  ARM的流水线结构为:   取指 -----> 译码 ------> 执行

ARM代码:                  PC           PC- 4        PC - 8

   地址:                   0x1008   0x1004     0x1000

  PC是指向被取指的指令,而不是正在执行的指令。(也就是说在此 PC值为0x1008 ,执行的是0x1000的代码)

  (即:书上摘录:由于ARM 体系结构采用了多级流水线技术,对于ARM 指令集而言,PC 总是指向当前指令的下两条指令的地址,PC 的值为当前指令的地址值加8 个字节)

2: 当发生BL跳转前,会在寄存器 R14 (即LR)中保存当前PC-4,即bl跳转指令的下一条指令的地址。所以在返回时只要 MOV pc,lr

3:中断

(1)当发生中断的时候,把是此时寄存器pc当前值(0x1008)存入LR_irq(此时的LR是中断模式下的LR),所以返回时,应该是将LR-4赋值给PC(0x1004)注:有些异常中断可能要将LR-8或LR赋值给PC。详细请仔细看ARM数据手册).

(2)当发生IRQ或FIQ后,系统要进入相应的异常模式进行处理,这些是由硬件实现的。

产生异常后,ARM核会做以下工作:
     <1>. 将正在执行代码的地址加4(或者加8)存到LR_irq寄存器里,即把处于译码指令的地址存入LR_irq
     <2>. 将CPSR复制到SPSR,
     <3>. 然后将异常模式的状态强制写入CPSR
     <4>. 强制PC从相关的异常向量处取指!!

中断结束后:

1. 将SPSR复制回CPSR

2. 关中断

3. 返回原程序,LDR PC,LR_irq

4:因为每个模式下面都有LR_mode,所以当返回原来模式时,原来模式下的LR并没有被破坏。

5:需要注意的是,当前使用指令STM/STR保存R15时候,保存的可能是当前指令地址值+8字节,也可能保存的是当前的指令地址+12字节.到底是哪种,取决于芯片的具体的设计方式。无论如何,在同一芯片中,要么采用当前的指令地址+8,要么采用当前的指令地址+12。因此对于用户来讲,尽量避免使用STM/STR指令来保存R15的值。但是可以在开始的时候用一段程序对芯片的offset进行测试!

代码如下:
SUB R1, PC, #4  ;获得下面的存放下面存放STR指令的地址,
STR PC,[R0]       ; [R0] = PC
LDR R0,[RO]      ;  R0  = PC
SUB R0, R0, R1  ;  R0  = PC - R1

大致流程如下:

   程序运行方向:                                         取指 -----> 译码 ------> 执行

指令:          SUB R0, R0, R1  LDR R0,[RO]  STR PC,[R0]  SUB R1, PC, #4

      STR(+ 8)         0x1010            0x100C            0x1004           0x1000

      STR(+12)        0x1014            0x1010            0x1004           0x1000

       1): 执行第一条指令SUB时:PC= 0x1004

       2): 执行第二条指令STR时:[R0] = 0x1010(+8) 或 [R0] = 0x1014(+12)

       3): 执行第三条指令LDR时:R0 = 0x1010(+8) 或 R0 = 0x1014(+12)

         3): 执行第四条指令SUB时:R0 = 0x1010- 0x1004 = 0x08  或  R0 = 0x1014- 0x1004 = 0x10

ARM7中断与PC、LR的问题:

1,假设当前是PC,PC-4,PC-8(三级流水)
2,发生IRQ异常,执行保护操作,LR中保存由于FIQ或IRQ占先而没有被执行的指令的地址(即有些资料上把这个地址写成PC或者当前地址,很费解甚至误解)的下一条地址
3,清空流水线
4,进入中断服务程序
5,待流水线填满,执行操作才被重新挂起(解释了ARM7为什么是0.9MIPS)
6,中断返回前,对LR处理,LR=LR-4,指向之前被清空的已译码但没被执行的指令的地址
7,清空流水线,返回
8,重新对丢弃的前一次已译码指令取指
9,待流水线满,开始继续执行

利用sub lr,lr,#4:程序是如何进行返回的?的更多相关文章

  1. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  2. 调试技巧 —— 如何利用windbg + dump + map分析程序异常

    调试技巧 —— 如何利用windbg + dump + map分析程序异常 逗比汪星人2011-09-04上传   调试技巧 —— 如何利用windbg + dump + map分析程序异常 http ...

  3. 如何利用JConsole观察分析Java程序的运行并进行排错调优_java

    如何利用JConsole观察分析Java程序的运行并进行排错调优_java 官方指导  use jconsole use jmx technology

  4. 利用C语言编辑画图程序的实现方法

    不知道大家在进行开发县级电网调度自动化系统的时候,是否都会遇到一个问题就是:要绘制一个电力系统一次接线图.大家都应该知道其实电力系统的一次接线图是较为复杂的,如果想要使用一般的编程方法来进行绘制的话, ...

  5. 利用python实现微信小程序游戏跳一跳详细教程

    利用python实现微信小程序游戏跳一跳详细教程 1 先安装python 然后再安装pip <a href="http://newmiracle.cn/wp-content/uploa ...

  6. 利用Pycharm断点调试Python程序

    利用Pycharm断点调试Python程序 1.代码 准备没有语法错误的Python程序: #!/usr/bin/pythonimport numpy as np class Network: def ...

  7. main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出。

    读到这里,大家应该了解了main函数返回值的来龙去脉了.下面介绍一下main函数返回值的作用以及如何获得这个返回值.main函数的返回值用于说明程序的退出状态.如果返回0,则代表程序正常退出.返回其它 ...

  8. “数据提供程序或其他服务返回 E_FAIL 状态”

    “数据提供程序或其他服务返回 E_FAIL 状态” 的问题 ADO 连接SQL SERVER

  9. 图片的URL上传至阿里云OSS操作(微信小程序二维码返回的二进制上传到OSS)

    当我们从网络中获取一个URL的图片我们要存储到本地或者是私有的云时,我们可以这样操作  把url中的图片文件下载到本地(或者上传到私有云中)  public String uploadUrlToOss ...

随机推荐

  1. Token在android中的使用

    首先Token是一个怎么样的东西,Token存在的意义又在哪里?学过php或是其他web开发的人都知道一个东西叫session和cookie,这些东西可以在服务器或是本地保存一些东西,比如说登录状态, ...

  2. 《Shell脚本学习指南》学习笔记之自定义函数

    Shell的函数在使用之前必须先定义,定义格式: [ function ] funname [()] { action; [return int;] } 可以带function fun()定义,也可以 ...

  3. [.net 面向对象程序设计深入](14)Redis——基础

    [.net 面向对象程序设计深入](14)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...

  4. div 宽高相等2种实现方式

    div.wh{ background:#ff0;width:50%;position:relative;display:inline-block; } div.wh:before{ content: ...

  5. Java面试13|算法

    1.冒泡排序 for(int i=0;i<n;i++){ for(int j=0;j<n-1-i;j++){ if(temp[j]>temp[j+1]){ int t=temp[j] ...

  6. DotNet友元程序集解析

    项目开发的过程中,调试使用的可能是最多的操作.任何代码写出来都需要经过调试和整合,以此扩展和提升程序的稳定性和可靠性.谈到.NET的单元测试,在这里就得提提.NET的友元程序集这一特性,也借用.NET ...

  7. 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  8. Python自动生产表情包

    作为一个数据分析师,应该信奉一句话--"一图胜千言".不过这里要说的并不是数据可视化,而是一款全民向的产品形态--表情包!!!! 表情包不仅仅是一种符号,更是一种文化--是促进社交 ...

  9. babel入门基础

    背景 babel的官网说babel是下一代的js语法编译器,现在自己也在很多项目中使用了babel,可是自己对babel的认识呢,只停留在从google和别人项目中copy的配置代码上,内心感到很不安 ...

  10. Java 8并发工具包漫游指南

    Java 8并发工具包简介 Java 8并发工具包由3个包组成,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concur ...