#define
OPERAND OPD //操作数
R REGISTER //寄存器
***************************************************************************************************
一.数据处理指令:
***************************************************************************************************
1.数据传送指令:SR是一个寄存器,被移位的寄存器,一个立即数
MOV{条件}{S} DR,SR
MVN{条件}{S} DR,SR //把SR中内容取反送DR
***************************************************************************************************
2.算术运算指令:没有除法指令. OPD是一个寄存器,被移位的寄存器,一个立即数
ADD{条件}{S} DR,R,OPD
ADC{条件}{S} DR,R,OPD //R + OPD + C(CPSR 中的条件标志位) => DR, 可以实现大于32位数的加法,要设置S位更改标志位
eg:
ADDS R0,R4,R8
ADCS R1,R5,R9
ADCS R2,R6,R10
ADC R3,R7,R11
R7 R6 R5 R4
+
R11 R10 R9 R8
________________
R3 R2 R1 R0
SUB{条件}{S} DR,R,OPD
SBC{条件}{S} DR,R,OPD //R - OPD - !C =>DR, 如果借位C=0,固减去C的反码1
RSB{条件}{S} DR,R,OPD //OPD - R => DR
RSC{条件}{S} DR,R,OPD
MUL{条件}{S} DR,R1,R2 //R1 * R2 => DR, DR != R1,都是寄存器
MLA{条件}{S} DR,R1,R2,R3 //R1 * R2 + R3 => DR
SMULL{条件}{S} DRL,DRH,R1,R2 //有符号数R1 * R2低位=>DRL,高位=>DRH
SMLAL{条件}{S} DRL,DRH,R1,R2 //R1 * R2低位 + DRL =>低位,高位 + DRH => 高位
UMULL{条件}{S} DRL,DRH,R1,R2 //无符号数
UMLAL{条件}{S} DRL,DRH,R1,R2 //无符号数
***************************************************************************************************
3.逻辑预算指令:OPD 是一个寄存器,被移位的寄存器,一个立即数
AND{条件}{S} DR,R,OPD //与
ORR{条件}{S} DR,R,OPD //或
EOR{条件}{S} DR,R,OPD //异或
BIC{条件}{S} DR,R,OPD //把R中OPD指定的位清0 => DR,R中内容不变
eg: AND R0,R0,#3 ;保持R0的0.1位,其余位清0
***************************************************************************************************
4.比较指令:OPD可以是一个寄存器或立即数
CMP{条件} R,OPD //只是比较,但寄存器内容不变,改变标志位(CPSR)
CMN{条件} R,OPD //R - !OPD 根据结果设置CPSR
TST{条件} R,OPD //R 和 OPD进行按位与,根据结果设置CPSR,一般R是要测试的数据,OPD是位掩码,用于测试是否设置了特定的位
TEQ{条件} R,OPD //R 和 OPD进行按位异或,一般比较两个数是否相等
***************************************************************************************************
二.分支/跳转指令:前后跳转32MB地址空间,DADD:目的地址
***************************************************************************************************
B{条件} DADD
BL{条件} DADD //lr = pc(此时pc值已经+4即指向下一条指令的地址),把返回地址记在lr中
BX{条件} DADD //DADD最后一位是是1切换到Thumb状态,否为ARM状态
BLX{条件} DADD //综合BL,BX
***************************************************************************************************
三、存储器访问指令:MADD:存储器地址,BR:基址寄存器,RLIST:寄存器列表
***************************************************************************************************
LDR{条件} DR,MADD //传送一个字
LDR{条件}B DR,MADD //一个字节,同时将寄存器高24位清零
LDR{条件}H DR,MADD //半字,高16位清零
STR{条件} SR,MADD //字
STR{条件}B SR,MADD //SR低字节
STR{条件}H SR,MADD //SR低半字
LDM{条件}{类型} BR{!},RLIST{^} //类型:IA(Increase After):每次传送后地址加4;IB:传送前加4;DA:传送后减4;DB:传
STM{条件}{类型} BR{!},RLIST{^} //送前减4;用于寄存器存储
//FD:满递减堆栈;ED:空递减堆栈;FA:满递增堆栈;EA:空递增堆栈;用于sp //(满堆栈和空堆栈是针对sp的位置而言的,如果sp指向最后 存放数据的地址,则称满堆 //栈;指向空的地址,是空栈)
//每次压栈出栈sp肯定要动,压栈时,如果sp先加4,则sp指向最后 存放数据的地址则是 //满栈,如果后加4,则指向空的地址,则是空栈
//{!}:若选用该后缀,当数据传送完毕后,将最后的地址写入基址寄存器;否则基址寄存
//器的内容不变。
//{^}:当指令为LDM,RLIST中包含R15,且选用该后缀时,表示除了正常的数据传送外, //还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不 //是当前模式下的寄存器。
eg:
LDR R0,[R1],R2,LSL #2 ;RO STM R13!,{R0,R4-R12,LR} ;将{R0,R4-R12,LR}存入满堆栈,每完成一个字的传送堆栈地址减4
***************************************************************************************************
四、协处理器指令:ARM可支持多达16个协处理器,CCP: coding of coprocessor
***************************************************************************************************
CDP{条件} CCP,协处理器操着码1,CDR,CSR1,CSR2,{协处理器操作码2} //CDR,CSR1,CSR2 > CP
LDC{条件}{L} CCP,CDR,[SR] //[SR] => CDR,L:指令为长读取操作
STC{条件}{L} CCP,CSR,[DR] //CSR => [DR]
MCR{条件} CCP,协处理器操着码1,SR,CDR1,CDR2,协处理器操作码2 //SR -> CP
MRC{条件} CCP,协处理器操着码1,DR,CSR1,CSR2,协处理器操着码2 //CP -> DR
***************************************************************************************************
五、杂项指令:
***************************************************************************************************
1、程序状态寄存器访问指令:
MRS{条件} DR,CPSR/SPSR //CPSR/SPSR -> DR
MSR{条件} CPSR/SPSR_,OPD //OPD:包括寄存器和立即数
//Domain:CPSR/SPSR分4个域,位[31:24]为条件标志位域,用f表示
//位[23:16]为状态位域,用s表示
//位[15:8]为扩展位域,用x表示
//位[7:0]为控制位域,用c表示
eg:
MSR CPSR,R0 ;R0 -> CPSR
MSR CPSR_c,R0 ;R0 -> CPSR,仅修改CPSR中的控制位
***************************************************************************************************
2、交换指令:
SWP{条件} DR,SR1,[SR2] //[SR2] -> DR,SR1 -> [SR2]
SWPB{条件} DR,SR1,[SR2] //低8位
***************************************************************************************************
3、SWI 和 BKPT 这两条指令可以使ARM进入异常模式,处理异常程序
SWI{条件} 24位立即数 //产生软件中断,使用户能调用操作系统的系统例程,24位立即数系统例程的类 //型,参数通过寄存器(一般是R0-R3)传递。
//当指令中24位立即数没有明确给出时,系统例程类型由R0内容决定
//在实际编程时,利用SWI来对用户编写的系统程序测试
BKPT 16位立即数 //引起ARM进入调试模式,产生软件断点中断,用于程序的调试
eg:
SWI 0x02 ;调用编号是02的系统例程
BKPT 0X580 ;在0x580处产生软件中断点
***************************************************************************************************
4、前导零计数指令:SR全为0,DR = 32;[31]为1,DR = 0
CLZ{条件} DR,SR //高位引导零个数计数 -> DR