STM32--汇编语言:子程呼叫与无条件跳转指令B、BL、BX和BLX
1、B:无条件转移
B指令是最简单的跳转指令。一旦遇到一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行。注意,存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是绝对地址,它的值由汇编器来计算。
例:B Label ;程序无条件跳转到标号Label处执行
2、BL:转移并连接,用于呼叫一个子程序,返回地址被存储在LR中
BL指令是带连接的跳转,在跳转之前,会在寄存器R14中保存PC的当前内容,因此可以通过将R14的内容重新加载到PC中,来返回到跳转指令的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。通常可以在子程序的尾部添加:MOV PC,LR返回
以下指令:
BL Label;当程序无条件跳转到Label处执行时,同时将当前的PC值保存到R14中
- BX:带状态切换的跳转
BX指令使程序跳转到指令中指定的地址执行程序。
- BLX:带连接和状态切换的跳转
BLX指令结合了BX与BL功能,BLX 指令从ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb 状态,该指令同时将PC 的当前内容保存到寄存器R14 中。因此,当子程序使用Thumb 指令集,而调用者使用ARM 指令集时,可以通过BLX 指令实现子程序的调用和处理器工作状态的切换。
子程序的返回可以通过将寄存器R14的值复制到PC中来完成。
最基本的无条件跳转指令有两条:
B Label ;跳转到 Label 处对应的地址
BX reg ;跳转到由寄存器 reg 给出的地址
呼叫子程序时,需要保存返回地址,正确的指令是:
BL Label ;跳转到 Label 对应的地址,并且把跳转前的下条指令地址保存到 LR
BLX reg ;跳转到由寄存器 reg 给出的地址,并根据 REG 的 LSB 切换处理器状态,
;还要把转移前的下条指令地址保存到 LR
执行这些指令后,就把返回地址存储到 LR(R14)中了,从而才能使用”BX LR”等形式返回。
注:
R14:连接寄存器(LR)
R15:程序计数器(PC)
STM32--汇编语言:子程呼叫与无条件跳转指令B、BL、BX和BLX相关推荐
- 16.控制转移指令(条件跳转指令、比较条件跳转指令、多条件分支跳转指令、无条件跳转指令)
目录 1.控制转移指令 1.1 条件跳转指令 1.2 比较条件跳转指令 1.3 多条件分支跳转指令 1.4 无条件跳转指令 1.控制转移指令 控制转移指令分为如下图所示的5种,其中比较指令在算术指令中 ...
- arm64汇编b带条件跳转指令和bl跳转带返回ret指令
文章目录 ret返回指令 B 跳转指令 BL 带返回的跳转指令 B指令可以接上后缀,用来和cmp比较后待条件的跳转 ret返回指令 cpu遇到ret之后,会把lr赋值给pc,这样cpu执行了pc里的地 ...
- 【Android 逆向】函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )
文章目录 前言 一.函数拦截需要的几个参数 二.插桩前先保存实际函数入口 6 字节数据 三.在插桩的函数入口写入跳转指令 | 构造拼接桩函数 前言 [Android 逆向]函数拦截实例 ( 函数拦截流 ...
- 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )
文章目录 一.GOT 表拦截与插桩拦截 二.插桩拦截简介 三.插桩拦截涉及的 ARM 和 x86 中的跳转指令 一.GOT 表拦截与插桩拦截 函数拦截有 222 种方式 : 使用 GOT 表进行函数拦 ...
- 西门子stl语言指令_STEP7项目的JL跳转指令你会用吗?
引言: 昨天测试一个PDF文档中的STL程序,照着录入后,竟然在程序保存的时候就出错了,不能保存!研究了一下发现是JL指令的使用造成的,所以今天写篇文章来聊一下,STEP7项目STL编程中的JL 跳转 ...
- 014-无条件跳转指令jmp+
l 无条件跳转指令jmp l goto指令 l 优化后的指令 l 标志寄存器PSW 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF T ...
- 汇编——跳转指令与分支结构(包括OF和CF的溢出判断)
汇编中的循环和分支结构 虽然我们没有花里胡哨的函数和对象等等,但是我们也可以实现循环和分支结构(其实就是if_else) 我们要知道一个问题,就是代码是一行行执行的. (其实这个是说给我这样的被Ver ...
- arm指令bne.w改成b,即无条件跳转
近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultrae ...
- Keils uVision5环境下STM32汇编语言程序开发
目录 一.如何在MDK5中建立工程 1建立工程 1.1创建工程 1.2选择芯片STM32F103RC 1.3运行环境选择,在CMSIS下选择CORE:Device下选择Startup 2.添加文件 ...
最新文章
- 自动驾驶汽车可用于处理急转弯的 3 种技术
- 深圳大学面向全球引进高精尖缺人才!
- 无人驾驶还有多久才能全面推开?
- Grub及MBR修复
- smart700iev3 程序下载设置_西门子PLC基础:S7-200 SMART PLC程序下载
- python线性加权模型_局部加权之线性回归(1) - Python实现
- 71. Merge k Sorted Lists
- [Swift]LeetCode480. 滑动窗口中位数 | Sliding Window Median
- Linux环境下实现简单进度条
- 本地时间转utc时间_有关机器时间、UTC时间、本地时间的总结
- C#解析HL7协议数据2.X
- 通信原理及系统系列7—— 什么是码间串扰
- Java 和python多态区别_python面向对象之多态鸭子类型与Java的比较
- 事务Transaction的理解(一)
- python求幂_python 求幂
- nginx: [emerg] unknown directive “锘? in******
- CentOS 压缩解压
- 开机provision应用
- 使用spilt截取文件名后缀时出现的问题
- Soapui报错There are currently 1 running SoapUI MockServices解决办法