ARM汇编程序中B指令和BL指令都是会跳转到某个标号处运行,类似于C语言中的goto 命令,例如利用B指令实现一个循环(每次对r0 寄存器中的值加1):

.textmov r0, #1           //将r0寄存器的值初始化为1loop:                   //要跳转的标号cmp r0, #10         //比较r0与10addle r0, #1        //满足r0小于等于10就加1ble loop            //满足r0小于等于10就跳转到loop标号处.end

执行结果如下,最后R0寄存器中的数值变为B(十进制的11),证明B指令的作用是单纯的进行跳转,因为寄存器LR中的值始终没有发生改变。

而BL指令也有跳转标号的作用,但是还有一个重要的是,在进行跳转时寄存器LR会保存跳转指令的下一个指令的地址,作用是什么呢?我们知道在C语言中在执行函数时有中断这个概念,程序会优先处理中断而暂时不顺序执行程序,当程序处理完中断后便会返回到之前的程序处继续执行,

这就是程序在遇到中断时的执行过程,在ARM中使用BL指令时,遇到跳转时LR寄存器会保存产生该跳转的下一条指令,目的是当程序执行完跳转程序后可以通过LR中的地址取出指令继续执行,还可以在程序产生异常时,LR通过 -4操作回到异常之前继续执行,例如我们通过BL指令模拟用户程序执行函数:

.textmov r0, #1                //初始化R0寄存器的值为1mov r1, #5                //初始化R1寄存器的值为5bl func_1                 //使用BL命令跳转到func_1处add r0, #10func_1:add r1, #20               //对寄存器R1做加20mov pc, lr                //将寄存器LR中的地址赋给PC程序计数器.end

当程序准备进行跳转时,即PC已经指向了CPU下一步该取指令的地址,LR保存了跳转指令的下一条指令的地址,即图中的0x0000000C,之后程序将在func_1中执行。

接下来再继续执行  mov pc, lr 指令后,PC所指向的指令就是之前LR寄存器中保存的地址对应的指令,所以CPU接下来就会到PC所指地址处取出指令执行,即会执行第六行的  add r0, #10

 这就模拟了一次C语言在处理函数时的过程,在去执行中断程序时先将原本程序的现场保护起来,待执行完中断程序后回到现场继续执行程序。

ARM编程中B指令与BL指令的区别相关推荐

  1. ARM指令B BL BLX BX区别

    1.B: 跳转. B 指令的格式为: B{条件} 目标地址 B 指令是最简单的跳转指令.一旦遇到一个B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行.注意存储在跳转指令中的实际值是相 ...

  2. ARM汇编中ldr伪指令和ldr指令(转载)

    转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...

  3. ARM 编程 LDM 批量数据加载指令——寄存器列表与书写顺序无关

    格式: LDM{<cond>}{<type>} <Rn> {!}, <regs> {^} 功能:连续存储单元的字数据→寄存器(多个) 数据单位:字. 用 ...

  4. 循环左移和循环右移指令_数控铣床编程中,关于钻孔循环指令G81G82G83G73,分享个人经验...

    从事数控铣床编程加工中,常会遇到钻孔加工.因此,编程人员首先需要了解孔加工类刀具的选择与使用:其次,要根据孔的形状和加工特点选择合适的固定循环指令,本文主要讲解四种钻孔切削循环指令. 首先,对工件孔加 ...

  5. ARM编程中的警告和错误处理

    转载自:(以后补充) KEIL 中 warning解决方法 在做数据处理的时候,出现warning: #223-D: function "abs" declared implici ...

  6. arm编程中__packed的使用

    今天在看代码的时候看到以下代码: [cpp] view plaincopy struct dsi_ctrl_hdr { char dtype; /* data type */ char last;   ...

  7. VBA编程中的 sheet1 与 sheets(1)的区别

    [自己理解]sheet1是一个专有名词,不是任何对象的属性,只能单独使用,特指代码所在工作簿的那个sheet1(和顺序无关,是固定的一个表,sheets(1)则和顺序有关). 参考资料: 1.代码中一 ...

  8. MFC编程中UpdateData(true)和UpdateData(false)的区别

    在用ClassWizard建立了控件和变量之间的联系后:当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE):如果你希望知道用户在对话框中到底输入了什 ...

  9. 谈谈Java编程中的拦截器与过滤器的区别

    拦截器是基于 Java 反射机制的,而过滤器是基于函数回调的. 过滤器依赖于 Servlet 容器,而拦截器不依赖于 Servlet 容器. 拦截器只能对 Action 请求起作用,而过滤器则可以对几 ...

最新文章

  1. word表格自动编号
  2. 用 rpm-ostree 数据库检查更新信息和更新日志的方法
  3. String与StringBuffer的区别
  4. Vector源码分析
  5. vue调用手机相机相册_今天才发现,点一下小米手机相册,能将照片一键制作成电影...
  6. zynq的emio和axi_【ZYNQ7000学习之旅 - 01】EMIO练习
  7. 【ElasticSearch】Es 源码之 NamedWriteableRegistry 源码解读
  8. MQTT 固定报头 中 剩余长度字段的计算
  9. MySQL:Specified key was too long; max key length is 1000 bytes
  10. LoadRunner启动自带例子Web Tours报错
  11. 美团2021届秋季校园招聘笔试真题解析:小美的跑腿代购
  12. android 断点下载的实现,Android实现断点下载的方法
  13. Python凯撒密码解密
  14. 汉字转16进制 php,PHP实现中文汉字与16进制编码转换
  15. oracle to_char函数格式,oracle 中to_char函数的用法
  16. php购物车登录用cookie,php利用cookies实现购物车的方法_PHP
  17. overflow:hidden的功能
  18. apns php流程
  19. 移动端前端UI库—Frozen UI、WeUI、SUI Mobile
  20. HTML中的script标签的含义和用法

热门文章

  1. 第四季度前三星手机将呈现两重惊喜
  2. 【深度学习系列4】深度学习及并行化实现概述
  3. 图像二值化后提边缘效果不好?那是你不会用HSV色彩空间
  4. 关于npx的基本知识
  5. OmniGraffle-新手指南
  6. Ubuntu 安装 OpenMPI
  7. COE文件与MIF文件使用方法
  8. web前端开发自学课程,CSS标准文档流,超详细
  9. java 判断两个日期时间/两个时间戳之间相隔多少天,也可用于获取从1970年以来到某个时间之间相隔多少天
  10. [基础]tfcenter开启Webdav文件服务