ARM编程中B指令与BL指令的区别
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指令的区别相关推荐
- ARM指令B BL BLX BX区别
1.B: 跳转. B 指令的格式为: B{条件} 目标地址 B 指令是最简单的跳转指令.一旦遇到一个B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行.注意存储在跳转指令中的实际值是相 ...
- ARM汇编中ldr伪指令和ldr指令(转载)
转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...
- ARM 编程 LDM 批量数据加载指令——寄存器列表与书写顺序无关
格式: LDM{<cond>}{<type>} <Rn> {!}, <regs> {^} 功能:连续存储单元的字数据→寄存器(多个) 数据单位:字. 用 ...
- 循环左移和循环右移指令_数控铣床编程中,关于钻孔循环指令G81G82G83G73,分享个人经验...
从事数控铣床编程加工中,常会遇到钻孔加工.因此,编程人员首先需要了解孔加工类刀具的选择与使用:其次,要根据孔的形状和加工特点选择合适的固定循环指令,本文主要讲解四种钻孔切削循环指令. 首先,对工件孔加 ...
- ARM编程中的警告和错误处理
转载自:(以后补充) KEIL 中 warning解决方法 在做数据处理的时候,出现warning: #223-D: function "abs" declared implici ...
- arm编程中__packed的使用
今天在看代码的时候看到以下代码: [cpp] view plaincopy struct dsi_ctrl_hdr { char dtype; /* data type */ char last; ...
- VBA编程中的 sheet1 与 sheets(1)的区别
[自己理解]sheet1是一个专有名词,不是任何对象的属性,只能单独使用,特指代码所在工作簿的那个sheet1(和顺序无关,是固定的一个表,sheets(1)则和顺序有关). 参考资料: 1.代码中一 ...
- MFC编程中UpdateData(true)和UpdateData(false)的区别
在用ClassWizard建立了控件和变量之间的联系后:当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE):如果你希望知道用户在对话框中到底输入了什 ...
- 谈谈Java编程中的拦截器与过滤器的区别
拦截器是基于 Java 反射机制的,而过滤器是基于函数回调的. 过滤器依赖于 Servlet 容器,而拦截器不依赖于 Servlet 容器. 拦截器只能对 Action 请求起作用,而过滤器则可以对几 ...
最新文章
- word表格自动编号
- 用 rpm-ostree 数据库检查更新信息和更新日志的方法
- String与StringBuffer的区别
- Vector源码分析
- vue调用手机相机相册_今天才发现,点一下小米手机相册,能将照片一键制作成电影...
- zynq的emio和axi_【ZYNQ7000学习之旅 - 01】EMIO练习
- 【ElasticSearch】Es 源码之 NamedWriteableRegistry 源码解读
- MQTT 固定报头 中 剩余长度字段的计算
- MySQL:Specified key was too long; max key length is 1000 bytes
- LoadRunner启动自带例子Web Tours报错
- 美团2021届秋季校园招聘笔试真题解析:小美的跑腿代购
- android 断点下载的实现,Android实现断点下载的方法
- Python凯撒密码解密
- 汉字转16进制 php,PHP实现中文汉字与16进制编码转换
- oracle to_char函数格式,oracle 中to_char函数的用法
- php购物车登录用cookie,php利用cookies实现购物车的方法_PHP
- overflow:hidden的功能
- apns php流程
- 移动端前端UI库—Frozen UI、WeUI、SUI Mobile
- HTML中的script标签的含义和用法