ARM汇编语言指令总结
ARM处理器有9种寻址方式:1、寄存器寻址,2、立即寻址,3、寄存器器移位寻址,4、寄存器间接寻址,5、基址寻址,6、多寄存器寻址,7、堆栈寻址,8、块拷贝寻址,9、相对寻址。
ARM指令集:ARM指令基本格式如下:
<OPCODE>{<COND>}{S}<Rd>,<Rn>{,<OPERAND2>}
其中<>的内容是必须的,{}的内容是可选的。OPCODE指令助记符,COND执行条件,S是否影响CPSR中的值,Rd目标寄存器,Rn第一个操作数的寄存器,OPERAND2第二个操作数。灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式:1)#immed_8r——常数表达式;2--)Rm——寄存器方式;3)Rm,shift——寄存器移位方式(ASR算术右移,LSL逻辑左移,LSR逻辑右移,ROR循环右移,RRX带扩展的右移1位)。COND执行条件:
下面介绍ARM指令:
1、存储器访问指令。存储器访问指令分为单寄存器操作指令和多寄存器操作指令。单寄存器操作指令LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。LDR:从内存到寄存器,加载数据。STR:将寄存器的数据存储到内存。LDRB操作字节,LDRH操作半字,LDRSH操作有符号半字。多寄存器操作指令LDM为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令LDMIA/STMIA(传送后地址加4
)、LDMIB/STMIB(传送前地址加4)、LDMDA/STMDA(传送后地址减4)、LDMDB/STMDB(传送前地址减4)进行读取和存储 。进行堆栈操作操作时,要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFD(满递减堆栈) 、STMED/LDMED(空递减堆栈)、STMFA/LDMFA(满递增堆栈)和STMEA/LDMEA(空递增堆栈)实现堆栈操作。
2、寄存器和存储器交换指令。SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。
SWP{cond}{B}Rd,Rm,[Rn]
3、ARM数据处理指令。分三类数据传送指令;算术逻辑运算指令;比较指令。数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。数据传送指令:MOV,MVN(数据取反传送指令);算术运算:ADD,SUB,RSB(逆向减法指令),ADC,SBC,RSC(带进位逆向减法指令);逻辑运算指令:ADD,ORR,EOR,BIC(位清除指令);比较指令:CMP,CMN(负数比较指令),TST(位测试指令),TEQ(相等测试指令)。
4、乘法指令。MUL(32乘法指令),MLA(32乘加指令),UMULL(64无符号乘法指令),UMLAL(64无符号乘加指令),SMULL(64有符号乘法指令),SMLAL(64有符号乘加指令)。
5、分支指令。B(分支指令),BL(带连接的分支指令),BX(带状态切换的分支指令)。
6、协处理器指令。CDP(协处理器数据操作指令),LDC(协处理器数据读取指令),STC(协处理器数据写入指令),MCR(ARM寄存器到协处理器寄存器的数据传送指令),MRC(协处理器寄存器到ARM寄存器到的数据传送指令)。
7、杂项。SWI(软件中断指令),MRS(读状态寄存器指令),MSR(写状态寄存器指令)。
8、伪指令。ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOVR0,R0”指令等。NOP可用于延时操作。
各个指令的具体作用,使用方式需查看更详细的说明。