多寄存器加载存储指令:
1.LDMIA指令、LDMIB指令、LDMDB指令、LDMDA指令
(1)LDMIA指令,IA表示每次传送后地址加4
(2)LDMIB指令,每次传送前地址加四
(3)LDMDB指令,每次传送前地址减4
(4)LDMDA指令,每次传送后地址减4
2.下面来看看STMIA指令、STMIB指令、STMDB指令、STMDA指令
(1)STMIA指令, STMIA R0,{R1,R2,R3,R4} ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,IA传送后地址加4,所以这里内存当中的地址是从0x8004开始变化的
(2)STMIB指令, STMIB R0,{R1,R2,R3,R4} ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,IB每次传送前地址加4,所以内存中的值是从0x8008开始变化的
(3)STMDB指令, STMDB R0,{R1,R2,R3,R4} ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,DB每次传送后地址减4,所以内存中的值是从0x8010开始递减变化的
(4)STMDA与上面STMDB指令类似,DA是每次传送后地址减4
3、ldr (LDR)
LDR R1, [R2]
就是把R2所指向的存储单元的内容的值(一个memory地址内的值),读取到R1中(一个register)
4、STR
STR R1, [R2]
就是把寄存器R1中的内容“保存”到R2所指向的存储的单元中(一个memory地址)
5、ldm(LDM)出栈操作
LDMFD SP! , {R0, R1, R2}
把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去
6、stm(STM)
STMFD SP!, {R0}
把R0保存到堆栈(sp指向的地址)中。
7、adr(ADR)
ADR R1, _start
取的是相对地址的值
特殊功能寄存器访问
1、MRS
MRS R0,CPSR ;传送CPSR 的内容到R0
MRS R0,SPSR ;传送SPSR 的内容到R0
2、MSR
通常用于恢复或改变程序状态寄存器的内容
MSR CPSR,R0 ;传送R0 的内容到CPSR
MSR SPSR,R0 ;传送R0 的内容到SPSR
MSR CPSR_c,R0 ;传送R0 的内容到SPSR,但仅仅修改CPSR 中的控制位域
ne 不相等
gt 大于
lt 小于
ge 大于等于
le 小于等于
and 与
orr 或 orr r8,r8,#1000
eor 异或
bic 位清零 bic r8,r8,#1000,第12位清0
lsl 逻辑左移操作
asl 算数左移
asr 算数右移 移位过程中符号位不变,即如果源操作数是正数,则字的高端空出的位补0,否则补1。
cmp 相减与零比较指令 cmp r0,#1通常与beq,bne连用
cmn 相加比较指令 cmn r1,r0;
tst 位与比较指令
teq 位异或比较指令
beq 为0跳转指令
bne 不为0跳转指令
add 相加指令
sub 相减指令 subs 时改变转态位
mov 模糊指令数据传送 mov r1,#4;mov r0,r1
ldr 单一存储指令 ldr r1,[r0,#-4]将r0-4存储单元的数据复制到r1中
ldm 多项处理指令加载指令 ldmia r0!,{r1-r3,r4}将r0存储空间的值读出到r1-r4中,r0自动加1 ldmfd出栈
str 单一存储指令 str r1,[r0,#-4]r1的数据放到r0-4存储单元中
stm 多项处理器指令存储指令 stmia r0!,{r1-r3,r4}将r1-r4的值保持到r0中,r0自动加1 stmfd sp!,{r1-r3,r4} r1-r4进栈
mcr 协处理器操作指令 mcr p15,0,r8,c1,c0,0 通用寄存器r8内存单元值写到p15协处理器内存单元中
mrc 协处理指令 mrc p15,0,r8,c1,c0,0 协处理器内存单元读到普通寄存器内存单元
msr 状态寄存器操作读出指令 msr cpsr,r0 把r0存储空间里的值读到cpsr0
mrs 状态寄存器操作读出指令 mrs r0,cpsr 把cpsr 读到r0存储空间里
swp 间接寻址
1.LDMIA指令、LDMIB指令、LDMDB指令、LDMDA指令
(1)LDMIA指令,IA表示每次传送后地址加4
(2)LDMIB指令,每次传送前地址加四
(3)LDMDB指令,每次传送前地址减4
(4)LDMDA指令,每次传送后地址减4
2.下面来看看STMIA指令、STMIB指令、STMDB指令、STMDA指令
(1)STMIA指令, STMIA R0,{R1,R2,R3,R4} ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,IA传送后地址加4,所以这里内存当中的地址是从0x8004开始变化的
(2)STMIB指令, STMIB R0,{R1,R2,R3,R4} ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,IB每次传送前地址加4,所以内存中的值是从0x8008开始变化的
(3)STMDB指令, STMDB R0,{R1,R2,R3,R4} ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,DB每次传送后地址减4,所以内存中的值是从0x8010开始递减变化的
(4)STMDA与上面STMDB指令类似,DA是每次传送后地址减4
3、ldr (LDR)
LDR R1, [R2]
就是把R2所指向的存储单元的内容的值(一个memory地址内的值),读取到R1中(一个register)
4、STR
STR R1, [R2]
就是把寄存器R1中的内容“保存”到R2所指向的存储的单元中(一个memory地址)
5、ldm(LDM)出栈操作
LDMFD SP! , {R0, R1, R2}
把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去
6、stm(STM)
STMFD SP!, {R0}
把R0保存到堆栈(sp指向的地址)中。
7、adr(ADR)
ADR R1, _start
取的是相对地址的值
特殊功能寄存器访问
1、MRS
MRS R0,CPSR ;传送CPSR 的内容到R0
MRS R0,SPSR ;传送SPSR 的内容到R0
2、MSR
通常用于恢复或改变程序状态寄存器的内容
MSR CPSR,R0 ;传送R0 的内容到CPSR
MSR SPSR,R0 ;传送R0 的内容到SPSR
MSR CPSR_c,R0 ;传送R0 的内容到SPSR,但仅仅修改CPSR 中的控制位域
ne 不相等
gt 大于
lt 小于
ge 大于等于
le 小于等于
and 与
orr 或 orr r8,r8,#1000
eor 异或
bic 位清零 bic r8,r8,#1000,第12位清0
lsl 逻辑左移操作
asl 算数左移
asr 算数右移 移位过程中符号位不变,即如果源操作数是正数,则字的高端空出的位补0,否则补1。
cmp 相减与零比较指令 cmp r0,#1通常与beq,bne连用
cmn 相加比较指令 cmn r1,r0;
tst 位与比较指令
teq 位异或比较指令
beq 为0跳转指令
bne 不为0跳转指令
add 相加指令
sub 相减指令 subs 时改变转态位
mov 模糊指令数据传送 mov r1,#4;mov r0,r1
ldr 单一存储指令 ldr r1,[r0,#-4]将r0-4存储单元的数据复制到r1中
ldm 多项处理指令加载指令 ldmia r0!,{r1-r3,r4}将r0存储空间的值读出到r1-r4中,r0自动加1 ldmfd出栈
str 单一存储指令 str r1,[r0,#-4]r1的数据放到r0-4存储单元中
stm 多项处理器指令存储指令 stmia r0!,{r1-r3,r4}将r1-r4的值保持到r0中,r0自动加1 stmfd sp!,{r1-r3,r4} r1-r4进栈
mcr 协处理器操作指令 mcr p15,0,r8,c1,c0,0 通用寄存器r8内存单元值写到p15协处理器内存单元中
mrc 协处理指令 mrc p15,0,r8,c1,c0,0 协处理器内存单元读到普通寄存器内存单元
msr 状态寄存器操作读出指令 msr cpsr,r0 把r0存储空间里的值读到cpsr0
mrs 状态寄存器操作读出指令 mrs r0,cpsr 把cpsr 读到r0存储空间里
swp 间接寻址