ARM
介绍 arm 基础内容。
1. arm汇编基础
1. LDMIA R0 , {R1,R2,R3,R4}
LDM为: 多寄存器“内存取”指令 IA表示每次LDM指令结束之后R0增加1个字 最终结果为R1 = [R0], R1 = [R0+#4], R1 = [R0+#8], R1 = [R0+#0xC]
2. 堆栈寻址 (FA、EA、FD、ED)
STMFD SP! , {R1-R7,LR} @ 将R1R7以及LR入栈 LDMFD SP! , {R1-R7,LR} @ 将R1R7以及LR出栈
3. 块拷贝寻址
LDM和STM为指令前缀,表示多寄存器寻址,指令后缀(IA、DA、IB、DB)。 LDMIA R0!, {R1-R3} @从R0所指向的内存地址依次取出3个字到R1、R2、R3寄存器 STMIA R0!, {R1-R3} @将R1、R2、R3所存储的内容依次存放在R0所指向的内存。
4. 相对寻址
2. 指令集
1. 由于arm芯片更新很快,所以指令集很多,使用较为普遍的就是arm指令集以及Thumb指令集。
2.跳转指令
arm实现了两种跳转类型,一种是直接使用跳转指令,另外一种则是给PC寄存器直接赋值。
1. B跳转指令
2. BL跳转指令
3. BX带状态切换的跳转指令
如下:
4.BLX带链接和状态切换的跳转指令
3.寄存器访问指令
存储器访问指令操作包括从存储区加载数据,存储数据到存储器,寄存器与存储器之间的数据交换等。
LDR
LDR
将内存中的数据放入到寄存器中
指令示例:
STR
STR
STR用于存储数据到制定地址。格式如下: STR{type}{cond}Rd,label STRD{cond}Rd,Rd2,label 用法如下: STR R0,[R2,#04]
将R0的值存储到R2+4的地址处
LDM
LDM
该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作。
特别注意, ! 为可选后缀。如果有 ! 则最终地址会写回到Rn寄存器
STM
STM
STM将一个寄存器列表的数据存储到指定的地址单元中。格式如下
PUSH&&POP
PUSH&&POP
格式如下: PUSH{cond}reglist POP{cond}reglist 栈操作指令
SWP
SWP
寄存器之间的数据交换。
格式为SWP{B}{cond}Rd,Rm,[Rn]
B是可选的字节,若有B,则交换字节,否则交换字 Rd为临时存放的寄存器,Rm是要替换
的值 Rn是要被替换
的数据地址
参考链接
Last updated