ARM 实战汇编内存操作
1、 使用工具ARM ADS
内存操作就是跟寄存器之间的转换,有寄存器和内存的转换,也有内存和寄存器之间的转换。
内存和寄存器之间分为:单寄存器的操作、多寄存器的操作
单寄存器的操作分为:
LDR Rn,Addn 按照字长读取
例子: MOV R1,0x12
LDRR0,[R1]
结果是将R1的内存地址给R0,这个就是之前提到的小端模式
什么是小端模式就是低位放低地址,高位放高地址
内存的值是以字长度而来的
STRRn,Addn
例子: MOV R1,#0x12
STR R1,[R0,#0x0C]
结果是把#0x12的值写到0x0C内存地址内
LDRB Rn,Addn 按照字节长读取
例子: MOV R1,0x12
LDRBR0,[R1]
结果是将FF内存地址给R0寄存器
STRB Rn,Addn 按照字节长读取
例子: MOV R1,0x12
STRBR0,[R1]
结果是将R0寄存器地址00给R1内存中的FF位
LDRH Rn,Addn按照半字节长读取
例子: MOV R1,0x12
LDRBR0,[R1]
结果是将FFEF0000内存地址给R0寄存器
STRH Rn,Addn 按照半字节长读取
例子: MOV R1,0x12
LDRBR0,[R1]
结果是将R0寄存器地址0000给R1内存中的FFEF位
多寄存器的操作分为:
地址模式分为:
1) 数据块的模式为IA(传输地址之后加4)
2) 数据块的模式为IB(传送地址之前加4)
3) 数据块的模式为DA(传送后地址减4)
4) 数据块的模式为DB(传送前地址减4)
堆栈模式分为:
1) EA(空递减堆栈)
2) EB(满递减堆栈)
3) ED(空递增堆栈)
4) FA(满递增堆栈)
LDM LDMIAR0,{R3-R9}按照多寄存器读取
例子: MOV R1,0xf
LDMIAR1,{R2-R4}
结果是将R1的寄存器中的内存地址给R2,R2的内存地址减4给R3,R3的内存地址减4给R4
STM STMIA R0,{R3-R9}按照多寄存器写入
例子 MOV R1,0x4
STMIAR1,{R2-R4}
结果是将R1的寄存器的地址开始重新写入R2-R4新的内存值
数据交换操作分为:
SWP Rn,R1,[Rn2] 内存和寄存器之间交换
例子 MOV R1,#0x0f
MOV R2,#0x12
SWP R0,R1,[R2]
结果将R2的0x12给R0,接着将R1的0x0f写入到R2的内存中去
跳转指令分为:
BL 带返回链接跳转指令
AREA hello,CODE,READONLY
ENTRY
START
Bstrom
MOVR1,#0x0f
MOVR2,#0x12
SWPR0,R1,[R2]
MOVR1,#0x4
STMIAR1,{R2-R4}
seond
LDRBR0,[R1]
MOVPC,LR
strom
BLseond
STRR1,[R0,#0x0C]
END
MRS 把程序状态寄存器值传送到通用寄存器里