ARM中如何实现跳转?
a. 直接向PC 寄存器赋值实现跳转
MOV PC ,R14
b.使用分支指令直接跳转
分支指令种类
1.B:分支指令
2.BL:带链接的分支指令(可返回)
3.BX:带状态切换的分支指令
多寄存器加载/存储指令:
可以实现在一组寄存器和一块连续的内存但愿之间传输数据
LDM 加载多个寄存器
STM 存储多个寄存器
(允许1条指令传送16个寄存器的任何子集或所有寄存器,主要用于现场保护.数据复制.常数传递等)
详情举例:
加载指令:
LDM 源地址,目标寄存器列表
(从源地址 -----> 目标寄存器列表)
存储指令:
STM 目标地址,源寄存器列表
(从源寄存器列表---->目标地址)
LDM/STM指令搭配不同的后缀实现不同的方式地址增长:
IA:每次传送后地址+4
IB:每次传送前地址+4
DA:每次传送后地址-4
DB:每次传送前地址-4
举例如图:
这里大家会不会想到堆栈操作里面的 满堆栈 和 空堆栈 里面的一系列操作呢?
其实他们之间是有相互关系的,当然,如果不了解什么是空堆栈和满堆栈的话,可以查看以下博客:ARM处理器寻址方式 之 堆栈寻址
关系如下图所示
最大区别
数据传送:使用临时寄存器作为基址来寻址
堆栈操作:使用SP寄存器作为基址来寻址
堆栈操作图
特殊情况
右上角多了一个^符号
表示SPSR(程序状态保存寄存器)要对CPSR(程序状态寄存器)进行还原(即取出数据来进行覆盖),进行程序状态寄存器的还原
寄存器和存储器交换指令:
SWP指令用于将一个内存但愿(该内存地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。使用SWP可实现信号量的操作。(注:Rm和Rd可以相同)
SWP 读入寄存器 ,输出寄存器 ,目标地址
首先把 目标地址里面的值取出放入到读入寄存器中,
然后把输出寄存器里面的值取出来存储到目标地址的内存单元。
(可以带后缀B,代表字节操作,不带B的默认是字 数据操作)
数据处理指令大致分为3类:
a.数据传送指令
b.算数逻辑运算指令
c.比较指令
数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有的ARM数据处理指令均可选择使用S后缀,并影响(CPSR寄存器)标志状态