ARM GNU汇编入门

多寄存器加载存储指令:
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 间接寻址




猜你喜欢

转载自blog.csdn.net/hgz_gs/article/details/51544318