ARM处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令6大指令。
一、跳转指令
跳转指令用于实现程序流程的跳转,在ARM程序中有以下两种方法可以实现程序流程的跳转。
1、使用专门的跳转指令。
2、直接向程序计数器PC写入跳转地址值,通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。
ARM指令集中共有4条跳转指令:
1、B跳转指令(只能跳转前后32M的地址空间),B跳转指令是代码位置无关的,经过汇编后会替换为当前PC值加(减)一个修正值,不管这条指令是在哪一个地方执行,都能跳转到指定的位置。
2、BL带返回的跳转指令,会在寄存器R14中保存PC的当前内容,因此,可以通 过将R14的内容重新加载到PC中,用于子程序的调用和返回。
3、BLX指令,带返回和状态切换的跳转指令。
4、BX带状态切换的跳转指令。
二、数据处理指令
数据处理指令可分为数据传送指令、算术运算指令、算术逻辑运算指令和比较指令等。
1、数据传送指令用于在寄存器和存储器之间进行数据的双向传输;
MOV R1, R0 ;将寄存器R0的值传送到寄存器R1
MOV R1, R0, LSL#3 ;将寄存器R0的值左移3位后传送到R1
MOV PC, R14 ;将寄存器R14的值传送到PC,常用于子程序返回
2、比较指令
CMP R1, #100 ;将寄存器R1的值与立即数100相减,并根据结果设置 CPSR的标志位。
TST R1, #0xfffe ;将寄存器R1的值与立即数0xfffe按位与,并根据结果 设置CPSR的标志位。
3、算数运算指令
ADD R0, R1,#256 ; R0 = R1 + 256;
SUB R0, R1, R2 ; R0 = R1 - R2
RSB R0, R2, R3, LSL#1 ; R0 = (R3<<1) - R2
4、逻辑运算指令
ADD R0, R0, #3 ;该指令保持R0的0、1位,其余位清零
ORR R0, R0, #3 ;该指令置R0的0、1位为1,其余位保持不变
BIC R0, R0, #3 ;该指令清除R0的高5位,其余位保持不变
三、乘法指令示
MUL R0,R1,R2 ;R0 = R1 × R2
MULS R0,R1,R2 ;R0 = R1 × R2,同时设置CPSR中的相关条件标志位
四、加载/存储指令
1、LDR指令:LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为 目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2] ! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地 址R1+R2写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址
R1+R2写入R1。
2、STR指令:STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址
R1+8写入R1。
STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。
五、批量数据加载/存储指令
ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令 用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。常用的加载存储指令如下:LDM(或STM)指令
LDM(或STM)指令的格式为:
LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{∧}
LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,{类型}为 以下几种情况:
IA 每次传送后地址加1;
IB 每次传送前地址加1;
DA 每次传送后地址减1;
DB 每次传送前地址减1;
FD 满递减堆栈;
ED 空递减堆栈;
FA 满递增堆栈;
EA 空递增堆栈;
{!}为可选后缀,若选用该后缀,则当数据 传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。
基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。
{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将 SPSR复制到CPSR。同时,该后缀还表 示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
STMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0,R4到R12, LR)存入堆栈。
LDMFD R13!, {R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0,R4到R12, LR)。
完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位;
六、逻辑位(与、或、异或)
1、 AND指令的格式为:
AND R0,R0,#3 ;该指令保持R0的0、1位,其余位清零。
2、 ORR指令(逻辑位 或)
ORR R0,R0,#3 ;该指令设置R0的0、1位,其余位保持不变。
3、 EOR指令(逻辑位 异或)
EOR R0,R0,#3 ;该指令反转R0的0、1位,其余位保持不变。
七、程序状态寄存器访问指令
1、 MRS指令:通用寄存器 程序状态寄存器(CPSR或SPSR)
当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
MRS R0,CPSR ;传送CPSR的内容到R0
MRS R0,SPSR ;传送 SPSR的内容到R0
2、 MSR指令:MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。
MSR{条件} 程序状态寄存器(CPSR或SPSR)_<域>,32位寄存器分为4个域:
位[31:24]为条件位域,用f表示;
位[23:16]为状态位域,用s表示;
位[15:8] 为扩展位域,用x表示;
位[7:0] 为控制位域,用c表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。
MSR CPSR,R0 ;传送R0的内容到CPSR
MSR SPSR,R0 ;传送R0的内容到SPSR
MSR CPSR_c,R0 ;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域
八、协处理器指令
1、 CDP指令
CDP指令的格式为:
CDP{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2, 协处理器操作码2。
CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1和协处理 器操作码2为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。
CDP P3,2,C12,C10,C3,4 ;该指令完成协处理器P3的初始化
2、 LDC指令
LDC指令的格式为:
LDC{条件}{L} 协处理器编码,目的寄存器,[源寄存器]
LDC指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指 令为长读取操作,如用于双精度数据的传输。
LDC P3,C4,[R0] ;将ARM处理器的寄存器R0所指向的存储器中的字数 据传送到协处理器P3的寄 存器C4中。
3、 STC指令
STC指令的格式为:
STC{条件}{L} 协处理器编码,源寄存器,[目的寄存器]
STC指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指 令为长读取操作,如用于双精度数据的传输。
STC P3,C4,[R0] ;将协处理器P3的寄存器C4中的字数据传送到ARM处理 器 的寄存器R0所指向的存储器中。
4、 MCR指令
MCR指令的格式为:
MCR{条件} 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。
MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理 器操作码2为协处理器将要执行的操作,源寄存器为ARM处理器的寄存器,目的寄存器1和目的寄存器2均为协处理器的寄 存器。
MCR P3,3,R0,C4,C5,6 ;将ARM处理器寄存器R0中的数据传送到协处 理 器P3的寄存器C4和C5 中。
5、 MRC指令
MRC指令的格式为:
MRC{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。
MRC指令用于将协处理器寄存器中的数据传送到ARM处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理 器操作码2为协处理器将要执行的操作,目的寄存器为ARM处理器的寄存器,源寄存器1和源寄存器2均为协处理器的寄存器。
MRC P3,3,R0,C4,C5,6 ;该指令将协处理器P3的寄存器中的数据传送到 ARM 处理器寄存器中。