ARM指令也称ARM汇编指令集,是用来操作及控制ARM处理器及其相关设备的32bit的汇编指令,相对于16bit的thumb指令集而言功能更加强大,包含指令与伪指令。现将常用指令归纳汇总如下:
一、指令、伪指令
指令:是机器码的助记符,经过汇编器编译为机器码后,可以由CPU执行。
伪指令:用来指导汇编器编译指令,是汇编器的产物,终不会生成机器码。
二、ARM指令的编写风格
汇编代码大写:在Windows中的IDE开发环境中一般都大写。
汇编代码小写:在Linux环境中,好遵循GNU风格,即指令一般用小写。
三、ARM汇编代码文件后缀的大小写问题
Windows环境:因为Windows不区分大小写,所以汇编文件后缀大写、小写编译过程没有区别,即test.S与test.s编译结果一致。
Linux环境:Linux环境是严格区分大小写的,test.S与test.s会被当成不同的文件来处理(处理过程也不一致)。后缀小写的test.s文件,在编译阶段不进行预处理操作,所以不能在这里面写预处理的语句(不能有宏定义等,不常用);后缀大写的test.S文件,会进行预处理、汇编等操作,所以我们可以在这里面加入预处理的命令(比较常用)。
四、ARM汇编指令的格式
ARM汇编指令的格式比较固定、简单,即是:“操作码目标寄存器,操作数1,操作数2,……操作数n”。
例如将十六进制数0xaf放到寄存器r0中,我们用汇编代码可以这样写“mov r0,#0xaf”。这里的“mov”就是操作码(指令),实现的功能是将“0xaf”这个数存放到寄存器中“r0”中,“r0”也即是目标寄存器,“#0xaf”也即是操作数。在这里,“#0xaf”表示立即数(立即寻址方式指令中给出的数称为立即数立即数,亦即是直接参与运算不需处理的数),立即数需要用“#”来标识。
五、ARM指令分类
ARM指令可以分为程序状态寄存器操作指令、寄存器装载与存储指令、算术与逻辑指令、移位指令、乘法指令、比较指令、分支指令、浮点数指令、伪指令。
1、程序状态寄存器操作指令
程序状态寄存器操作指令包含msr、mrs两个指令。
(1)msr实现将通用寄存器(r0-r15)的值复制到状态寄存器(cpsr及spsr)中,用于更改处理器的工作模式及状态。例如,
MSR CPSR, R0 ;复制 R0 到 CPSR 中
MSR SPSR, R0 ;复制 R0 到 SPSR 中
(2)mrs实现将状态寄存器(cpsr及spsr)的值复制到通用寄存器(r0-r15)中,用于读取处理器的工作模式及状态。例如,
MRS R0, CPSR ; 复制 CPSR 到 R0 中
MRS R0, SPSR ; 复制 SPSR 到 R0 中
2、寄存器装载与存储指令
常用寄存器装载与存储指令操作指令包含ldr、str、ldm、stm四个指令,其中ldm、stm可以实现多个数据的传输。
(1)ldr实现将所在内存地址的值装载到寄存器中。
ldr rd, [rba