ARM学习笔记---ARM指令(二)

 

 

 

 

 

 

 

 汇编代码练习

	area  mytexcode, code, readonly

;一般异常向量表都在最前面
	b  reset ;	ldr pc, reset_space	  ; 0x0 
undefined_exception
	b  	undefined_exception					; 0x4
swi_exception
	b  	swi_exception						; 0x8
prefecth_exception
	b  	prefecth_exception						; 0xC
dataAbort_exception
	b  	dataAbort_exception						; 0x10												                 
reserved_exception						  		;0x14	nop	
	b  	reserved_exception					
IRQ_exception									; 0x18
	b  	IRQ_exception							
FIQ_exception									;0x1C
	b  	FIQ_exception



reset
 	mov r0, #4		  ; r0=4
	mov r1, #5	     ; r1=5
	mov r2, r1	    ; r2=5
	mov r3, r2, lsl	#2	  ; r3=r2<<2=5*4=20
	add r4, r2, r3  ;  r4=r2+r3=5+r0=25
	sub r5, r4, r4 ;  r5=r4-r4=0 不会更新标志位
	subs r5, r4, r4 ; 	 r5=r4-r4=0 更新标志位 z=1

	bl delay	;演示如何延迟

	;正常位svc模式模式切换:修改低5bit为0x1f
	mrs r0, cpsr    ;读取cpsr
	bic r0, r0, #(0x1f<<0)	 ; r0=r0&(~(0x1f<<0))将低5bit全部清零
	orr r0, r0, #(0x1f<<0)   ; r0=r0|(0x1f<<0) 	  将低5bit全部置1
	msr cpsr_c, r0   ;写入到cpsr

	bl gcdfunc

	swi 45

	ldr r5, =0x234332
    ;读写内存数据
	;初始化起始位置
	ldr r5, =0x40000000
	mov r1, #12 ; 0xC
	mov r2, #14 ; 0xE
	str r1, [r5, #4] ;将12存入0x40000004 : r5==0x40000000
	str r2, [r5], #8 ;将14存入0x40000000 : r5= 0x40000008

	bl  copyfunc 
	;一次性将所有数据拷贝到r1-r8
	ldr r0, =mydata	  ;r0为起始位置
	ldmia  r0!, {r1-r8} ;一次加载所有8个数据

	
loop
 	b loop

copyfunc
	;连续将8个数据写入到0x40000010
	ldr r6, =0x40000010 ;初始化目标地址
	ldr r7, =mydata   ;设定源数据地址  	ldr r7, mydata 得到的就是mydata起始地址对应空间的数据
	;取数据
	mov r0, #8	  ;控制次数
copyloop
	ldr r8, [r7], #4  ; 先去取数据,r7自加4
	str r8, [r6], #4 ; 先存数据,r6自加4
	subs r0, r0, #1
	bne copyloop   ;状态寄存器中位是否为零
	mov pc, lr


delay
	mov r0, #10 ;初始化,延迟多少个cpu周期
delayloop
	;不停的减1
	sub r0, r0, #1
	cmp r0, #0
	;如果不为0, 就会继续减,为0,就会立马跳出
    bne delayloop  ;如果不相同就继续循环, ne/eq表示条件码
	mov pc, lr	
; 	bx lr



gcdfunc
	mov r0, #24;初始化
	mov r1, #9 ;
gcdloop
	;表示将r0与r1比较
	cmp r0, r1     
	;如果r0大于r1
	subgt r0, r0, r1  
	sublt r1, r1, r0
	bne gcdloop 

	mov pc, lr



mydata
	dcd  0x1b  ;相当于定义了数组
    dcd  0x2b
	dcd  0x3b
	dcd  0x4b
	dcd  0x5b
	dcd  0x6b
	dcd  0x7b
	dcd  0x8b


reset_space 
	dcd  reset

	end

猜你喜欢

转载自blog.csdn.net/weixin_42471952/article/details/81410883