首页 > 其他 > 详细

在实例中学习arm汇编指令

时间:2014-04-17 03:06:14      阅读:744      评论:0      收藏:0      [点我收藏+]

ARM指令:

			GBLA	Test1   ;声明一个全局的数学变量,变量名为Test1
			GBLL	Test2  ;申明一个全局的逻辑变量,变量名为Test2
Test1   SETA  0x3  ;将变量Test1赋值为3,注意书写格式,需要顶格写	
Test2		SETL	{TRUE}				;将变量Test2赋值为TRUE

;EQU伪指令
COUNT		EQU		0x30003100	; 定义一个变量,地址为0x30003100	
			
			
			AREA	Example1,CODE,READONLY	; 声明代码段Example1
			ENTRY				; 标识程序入口
			CODE32				; 声明32位ARM指令
			
START
		
			;立即寻址
			MOV		R0,#0 	    ; R0 <= 0,将立即数0x00存入寄存器R0,可通过AXD的processor views-->register查看
			ADD R0,R0,#1	    ; R0 <= R0 + 1
			ADD R0,R0,#0x3f	  ; R0 <= R0 + 0x3f
			
			;寄存器寻址
			MOV R1,#1			    ; R1 <= 1,将立即数0x01存入寄存器R1
			MOV R2,#2			    ; R2 <= 2,将立即数0x02存入寄存器R2
			ADD R0,R1,R2			; R0 <= R1+R2,将寄存器R1和R2的内容相加,其结果存放在寄存器R0中
			
			;寄存器间接寻址
		  LDR		R1,=COUNT	     ; R1 <= COUNT,将存储器地址放入寄存器R0
			;MOV		R0,#0x12		 ; R0 <= 0x12,MOV指令目地操作数只能是8位
			LDR 	R0,=0x12345678	
			STR		R0,[R1]		     ; [R1] <= R0,将寄存器R0的内容存入寄存器R1所指向的存储器
											     ;即设置COUNT为0x12345678,
											     ;STR指令用于从源寄存器中将一个32位的字数据传送到存储器中
										       ;可通过AXD的processor views-->memory查看0x30003100的值
						
			;基址变址寻址
			LDR		R1,=COUNT					 ;将存储器地址0x30003100放入寄存器R1
			LDR		R2,=(COUNT+4)			 ;将存储器地址0x30003104放入寄存器R1
			MOV R3,#0x12             ;将立即数0x12存入寄存器R3
			STR	R3,[R2]							 ;将寄存器R3的内容存入寄存器R2所指向的存储器
			LDR	R4,[R1,#4]					 ;将寄存器R1的内容加上4所指向的存储器的字存入寄存器R4
			
			;多寄存器寻址
			LDR		R1,=COUNT					 ;将存储器地址0x30003100放入寄存器R1
			LDMIA R1,{R5,R6}				 ;R5 <= [R1],R6 <= [R1+4]

							
			;相对寻址
			BL NEXT 	;跳转到子程序NEXT处执行,注意使用F8(step in)
			NOP
			NOP
			
			
			;跳转指令(B)
			B	label1	;跳转到子程序label1处执行
			NOP
			NOP
			NOP
			
NEXT
			MOV R0,LR
			NOP
			NOP
			NOP
			MOV PC,LR		;从子程序返回

label1	
			NOP 
			NOP
			NOP
			
			;跳转指令(BL)
			BL	lable2	;跳转到子程序label2处执行
			NOP
			NOP
			
			;MOV指令
			MOV	R0,#0x12	;R0=0x12
			MOV	R1,R0			;R1=R0
			MOV	R1,R0,LSL#3	;R1=R0<<3
			
			;MVN指令
			MVN	R0,#0xff	; R0 = 0xfffff00 
			MVN		R0,#0xA0000007		; 0xA0000007的反码为0x5FFFFFF8
			
			
			;CMP指令(使用AXD查看CPSR)
			MOV	R0,#1
			MOV	R1,#2	
			CMP	R0,R1	;若R0>R1,则置R0=3,若R0<=R1,则置R1=3
			MOVHI	R0,#3	 ;根据CPSR条件标志位中的HI(无符号大于)判断,若R0>R1,则R0=3
			MOVLS	R1,#3	 ;根据CPSR条件标志位中的LS(无符号小于或等于)判断,R0<=R1,则R1=3
			
			
			;TST指令,测试R5的bit23是否为1,若是则置R5=0x01,不是则置R5=0x00
			LDR	R5,=0xffffffff
			TST	R5,#(1<<23)	;当bit23位为1时,CPSR EQ位被设置
			MOVEQ	R5,#0x00
			MOVNE	R5,#0x01
	
			;ADD指令
			MOV	R1,#1
			MOV	R2,#2
			MOV	R3,#3
			ADD	R0,R1,R2		;R0=R1+R2
			ADD	R0,R1,#256	;R0=R1+256
			ADD	R0,R2,R3,LSL#1	;R0=R2+(R3<<1)
			
			;SUB指令
			MOV	R1,#100
			MOV	R2,#8
			SUB	R0,R1,R2	;R0=R1-R2
			SUB	R0,R1,#55	;R0=R1-256
			
			;AND指令
			MOV	R0,#0xff
			AND	R0,R0,#3	;逻辑与运算,R0 = R0 & 3
			
			;ORR指令
			MOV	R0,#0xff
			ORR	R0,R0,#3	;逻辑或运算,R0 = R0 | 3
			
			
			;BIC指令
			MOV	R0,#0x77
			BIC	R0,R0,#0x0b	;将R0的bit0,bit1,bit3清零,其余位不变
			
			
			;MUL指令
			MOV	R1,#10
			MOV	R2,#20
			MUL	R0,R1,R2	;R0=R1*R2
			
			;MRS指令(将CPSR或者SPSR的内容传送到通用寄存器)
			MRS	R0,CPSR	;传送CPSR的内容到R0
			MRS	R1,SPSR	;传送SPSR的内容到R1
			
			;LDR指令
			LDR	R1,=0x30003100	;R1=0x30003100,使用AXD的processor views-->memory查看内存的值
			LDR	R0,[R1]					;R0=[R1]
			LDR	R0,[R1,#4]			;R0=[R1+4]
			
			;LDRB,LDRH指令
			LDR	R1,=0x30003100
			LDRB R0,[R1]				;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零
			LDRH R2,[R1]				;将存储器地址为R1的半字数据读入寄存器R2,并将R2的高16位清零
			
			;STR指令,内存地址0x30003100=0xab
			LDR	R1,=0x30003100
			MOV	R0,#0xab
			STR R0,[R1]					;将R0中的字数据写入以R1为地址的存储器中
			STR	R0,[R1,#8]			;将R0中的字数据写入以R1+8为地址的存储器中
			
			
			;LDM,STM指令
			LDR		R1,=0x30003100
			LDMIA R1,{R5,R6}				 ;R5 = [R1],R6 = [R1+4]
			MOV 	R2,#0x33
			MOV		R3,#0X44
			STMIA	R1,{R2,R3}				 ;[R1]=R2,[R1+4]=R2
			
			
			;SWP指令
			SWP	R0,R0,[R1]	;	该指令完成将R1所指向的存储器中的字数据与R0中的字数据交换
			
			;移位指令
			MOV	R1,#4
			MOV	R0,R1,LSL#2	;R0=R1<<2	
			MOV	R1,#3	
			MOV	R0,R1,ROR#2 ;将R1中的内容循环右移两位后传送到R0中

			
		
			;汇编控制伪指令,while指令 
			WHILE	Test1<10
				MOV R0,#Test1
				MOV R1,#1
Test1   SETA Test1+1
			WEND
		
		  ;汇编控制伪指令,IF指令
			IF Test2 = {TRUE}
				MOV R0,#1
				MOV R1,#2
			ELSE
				MOV R0,#0
				MOV R1,#0
			ENDIF
			B	out
lable2
			MOV R0,LR		;查看R14
			NOP
			NOP
			MOV	PC,LR		;从子程序返回
			

out		
			NOP



			


	END


 

在实例中学习arm汇编指令,布布扣,bubuko.com

在实例中学习arm汇编指令

原文:http://blog.csdn.net/chun_1959/article/details/23871275

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!