arm instruct arm instruct

源代码在线查看: arm 指令.txt

软件大小: 3 K
上传用户: LIBIN200788
关键词: instruct arm
下载地址: 免注册下载 普通下载 VIP

相关代码

				#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
					
				
				
				
				
				
				
				
				
				
				
							

相关资源