arm常用指令主要包括以下六类:
1、数据处理指令:完成寄存器中数据的算术和逻辑运算操作
2、程序状态寄存器处理指令:MRS MSR
3、跳转指令:B和BL
4、load/store指令:用于寄存器和存储器之间数据传送的指令
5、异常中断指令:SWI和BKPT
6、协处理器指令:MRC MCR
=-------------------------------------------------------------------
二、汇编指令的格式
arm指令编码格式:
如:ADDEQS R0,R1,R2 :加上S,cpsr寄存器中的标志位能被置位
--------------------------------------------------------------------------
寻址方式:共有9种
立即数寻址
SUBS R0,R0,#1 @R0=R0-1
ADD R0,#1,R0:这种方式是错误的,立即数只能作为第二操作数
立即数的合法性判断:合法性即:如果某个数据是非法的,是不能作为立即数的
此外还有一个简单的规则:
1、立即数处于0x0---0xff之间
2、如果立即数大于0xff,立即数循环左移偶数位,得到一个在0x0--0xff之间的一个数
满足以上两个条件即合法:
非法数举例:0x101 0xffffff
非法数可通过这样来操作举例:LDR R1,=0xfffff
,寄存器寻址
MOV R1,R2
,寄存器间接寻址
LDR R1,[R2] ;将R2指向的存储单元的数据读出保存在R1中
STR R1,[R2];将R1中的数据读出来保存在R2指向的存储单元中
SWP R1,R1,[R2]; 可分解为:[R2]<--R1 ,R1<--[R2]
,寄存器偏移寻址
MOV R0,R2,LSL #3
,基址变址寻址
LDR R1,[R3,#0X0C] ;读取R3+0xc地址上的存储单元的内容放到R1中
LDR R1,[R0],#4;可分解为 R1<--[R0];R0=R0+4
LDR R1,[R0,#-4]!;可分解为 R1<--[R0-4], R0=R0-4 R0中数据会自动更新
,多寄存器寻址
LDMIA R1!,{ R2-R7,R12};将R1指向的单元中的数据读出到R2-R7,R12中,R1自动+1
STMIA R0!,{ R2-R7,R12};
,堆栈寻址
几个重要概念:
嵌入式:使用的是满栈减栈 m:多个寄存器操作,F:FULL d:decrease
STMFD sp!,{r4-r7,lr};将R4-R7,LR寄存器的值压栈,同时sp的值自动更新,先入编号大的寄存器
LAMFD sp!,{r4-r7,lr};将栈中的内容放到r4-r7,lr中,SP自动更新,先出的数据给小的寄存器;
,块拷贝寻址
,相对寻址;
BL SUBR1;调用SUBR1子程序
。。。
SUBR1 ..
MOV PC,R14
---------------------------------------------------------------------------
指令按功能分类:
跳转指令:B,BX,BL,BLX只能跳转+/-32Mb
超过这个范围可通过LDR PC,=LABEL来跳转;
--------------------------------------------
寄存器与存储器交换指令(状态寄存器独有的)
MRS R0,CPSR
BIC R0,R0,#(1<<7)
MSR CPSR,R0
这样一来只修改了第七位
---------------------------------
逻辑运算指令:AND ,ORR,EOR,BIC
BIC R1,R2,R3 ;将R3的反码和R2逻辑与,结果存放到R1中;
----------------------------------------------
协处理器指令:
arm微处理器可支持多达16个协处理器,每个协处理器里有多个寄存器;
MRC P15,0,Rd,C0,C0,0;读取协处理器C0中编号为0的寄存器到Rd中。
MCR ...
*MCR CPSR_c,r0
--------------------------------------------------------------
arm汇编伪指令(并不是真正的arm指令,在编译的时候,编译器会讲伪指令变成真的arm指令)
start
ADRL
LDR R1,=0X33(伪指令)
LDR R1,[R2](ARM指令)