⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arm 指令.txt

📁 arm instruct arm instruct
💻 TXT
字号:
#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 <= [R1], R1 = R1 + R2 * 4
		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_<Domain>,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
	










⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -