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

📄 vector.s

📁 arm编程 ads应用hello.rar
💻 S
字号:
ModeMask 		EQU	0x1F
SVC32Mode		EQU	0x13
IRQ32Mode		EQU	0x12
FIQ32Mode		EQU	0x11
User32Mode		EQU	0x10
Abort32Mode		EQU	0x17
Undef32Mode		EQU	0x1B
IRQ_BIT			EQU	0x80
FIQ_BIT			EQU	0x40

	GBLS	MainEntry
MainEntry	SETS	"main"
	IMPORT	$MainEntry

;*******************************************************************
;检查是否使用tasm.exe进行编译
	
 GBLL    THUMBCODE
    [ {CONFIG} = 16	
THUMBCODE SETL	{TRUE}
    CODE32
    |   
THUMBCODE SETL	{FALSE}
    ]

    [ THUMBCODE
    CODE32   ;for start-up code for Thumb mode
    ]    
 	    
;*******************************************************************
	AREA	SelfBoot,	CODE,	READONLY
	
	IMPORT	UDF_INS_VECTOR
	IMPORT	SWI_SVC_VECTOR
	IMPORT	INS_ABT_VECTOR
	IMPORT	DAT_ABT_VECTOR
	IMPORT	IRQ_SVC_VECTOR
	IMPORT	FIQ_SVC_VECTOR				
	
	ENTRY	
	IF :DEF: |ads$version|
	ELSE
	EXPORT	__main
__main
	ENDIF		
ResetEntry
	b	SYS_RST_HANDLER
	b	UDF_INS_HANDLER
	b	SWI_SVC_HANDLER
	b	INS_ABT_HANDLER
	b	DAT_ABT_HANDLER
	b	.
	b	IRQ_SVC_HANDLER
	b	FIQ_SVC_HANDLER

;*******************************************************************
	MACRO	
$Label	HANDLER	$Vector
$Label
	sub	lr, lr, #4			
	stmfd	sp!, {r0-r3, lr}	
	ldr	r0, =$Vector
	ldr	pc, [r0]
	ldmfd	sp!, {r0-r3, pc}^		
	MEND
	
UDF_INS_HANDLER
	stmfd	sp!, {r0-r3, lr}
	ldr	r0, =UDF_INS_VECTOR
	mov	lr, pc
	ldr	pc, [r0]
	ldmfd	sp!, {r0-r3, pc}^
SWI_SVC_HANDLER
	stmfd	sp!, {r0-r3, lr}
	ldr	r0, =SWI_SVC_VECTOR
	mov	lr, pc
	ldr	pc, [r0]
	ldmfd	sp!, {r0-r3, pc}^
INS_ABT_HANDLER
	sub	lr, lr, #4
	stmfd	sp!, {r0-r3, lr}
	ldr	r0, =INS_ABT_VECTOR
	mov	lr, pc
	ldr	pc, [r0]
	ldmfd	sp!, {r0-r3, pc}^
DAT_ABT_HANDLER
	sub	lr, lr, #4
	stmfd	sp!, {r0-r3, lr}
	ldr	r0, =DAT_ABT_VECTOR
	mov	lr, pc
	ldr	pc, [r0]
	ldmfd	sp!, {r0-r3, pc}^
IRQ_SVC_HANDLER
	SUB	sp, sp, #4
	STMFD	sp!, {r0}
	LDR	r0, =HandleIrq
	LDR	r0, [r0]
	STR	r0, [sp, #4]
	LDMFD	sp!, {r0, pc}
FIQ_SVC_HANDLER
	sub	lr, lr, #4
	stmfd	sp!, {r0-r12, lr}	
	mrs	r0, spsr
	stmfd	sp!, {r0}
	ldr	r0, =IRQ_SVC_VECTOR
	ldr	pc, [r0]
				
;*******************************************************************
SYS_RST_HANDLER
	mrs	r0, cpsr				;enter svc mode and disable irq,fiq
	bic	r0, r0, #ModeMask
	orr	r0, r0, #(SVC32Mode :OR: IRQ_BIT :OR: FIQ_BIT)
	msr	cpsr_c, r0
	
	IMPORT	InitSystem
	bl	InitSystem	
	
	adr	r0, ResetEntry
	ldr	r1,	BaseOfROM
	cmp	r0,	r1
	ldreq	r0, TopOfROM
	beq	InitRamData
			
	ldr	r2,	=CopyProcBeg
	sub	r1, r2, r1
	add	r0, r0, r1	
	ldr	r3,	=CopyProcEnd	
0	
	ldmia	r0!, {r4-r7}
	stmia	r2!, {r4-r7}
	cmp	r2, r3
	bcc	%B0	
	
	ldr	r3, TopOfROM		
	ldr	pc, =CopyProcBeg
	
;*******************************************************************
CopyProcBeg	
0	
	ldmia	r0!, {r4-r11}
	stmia	r2!, {r4-r11}
	cmp	r2, r3
	bcc	%B0	
CopyProcEnd
	
	sub	r1, r2, r3
	sub	r0, r0, r1		
	
InitRamData	
	ldr	r2, BaseOfBSS
	ldr	r3, BaseOfZero	
0
	cmp	r2, r3
	ldrcc	r1, [r0], #4
	strcc	r1, [r2], #4
	bcc	%B0	

	mov	r0,	#0
	ldr	r3,	EndOfBSS
1	
	cmp	r2,	r3
	strcc	r0, [r2], #4
	bcc	%B1			
	
	
	mrs r0,cpsr
	orr r0,r0,#0xdf
	msr cpsr_cxsf,r0 
		 		 		
	ldr	pc,	GotoMain	



SystemIrqHandler
	IMPORT	ISR_IrqHandler
	          ;Handler In C source file
	;IMPORT  OSIntNesting
	
    
	stmfd	sp,{r0-r2}	
				        
	IMPORT	IntOffSet	

    ldr      r0,=0x01e00020	;I_ISPR
    ldr      r0,[r0]
    ;ldr      r2,=IntOffSet
    ;str      r0,[r2]			
    
    mov       r1,r0
    mov       r2,#0 
0
    movs      r1,r1,lsr #1
    bcs       %f1
    add       r2,r2,#1
    b         %b0
    
1
    ldr      r1,=IntOffSet
    str      r2,[r1]        
    
    ;mov      r0,r0,lsr #2	
    ;mov      r1,#1
    ;mov      r0,r1,lsl r0
    
    ldr      r2,=0x01e00024	;I_ISPC 
    str      r0,[r2]          
  	

	sub	r0,sp,#12	    
	sub	r2,lr,#4	    
	
	mrs	r1,spsr		
	orr	r1,r1,#0x80	    
	;bic r1,r1,#0x80	 
	msr	cpsr_cxsf,r1	


	stmfd	sp!,{r2}	    ;pc
	stmfd	sp!,{lr}	    ;lr
	stmfd	sp!,{r3-r12}	
	ldmia	r0!,{r3-r5}	
	stmfd	sp!,{r3-r5}	    	
	 
	bic	    r1,r1,#0x80     
	stmfd	sp!,{r1}	    
    ;mrs	r1,spsr		    
	stmfd	sp!,{r1}	    

    
	BL	ISR_IrqHandler

	LDMFD	sp!, {r0}		
	;msr	SPSR_cxsf, r0		; 运行在sys模式下,无需SPSR的更新
	LDMFD	sp!, {r0}
	MSR	    CPSR_cxsf, r0
	LDMFD	sp!, {r0-r12, lr, pc}
	;现场恢复完毕
;*******************************************************************

HandleIrq	DCD	SystemIrqHandler

GotoMain	DCD	$MainEntry

;*******************************************************************
	IMPORT	|Image$$RO$$Base|	; ROM code start	
	IMPORT	|Image$$RO$$Limit|	; RAM data starts after ROM program
	IMPORT	|Image$$RW$$Base|	; Pre-initialised variables
	IMPORT	|Image$$ZI$$Base|	; uninitialised variables
	IMPORT	|Image$$ZI$$Limit|	; End of variable RAM space


BaseOfROM	DCD	|Image$$RO$$Base|
TopOfROM	DCD	|Image$$RO$$Limit|
BaseOfBSS	DCD	|Image$$RW$$Base|
BaseOfZero	DCD	|Image$$ZI$$Base|
EndOfBSS	DCD	|Image$$ZI$$Limit|

	EXPORT	GetBaseOfROM
	EXPORT	GetEndOfROM
	EXPORT	GetBaseOfBSS
	EXPORT	GetBaseOfZero
	EXPORT	GetEndOfBSS
	EXPORT  GetPC
	
GetBaseOfROM
	ldr	r0, BaseOfROM
	mov	pc, lr	
GetEndOfROM
	ldr	r0, TopOfROM
	mov	pc,	lr
GetBaseOfBSS
	ldr	r0,	BaseOfBSS
	mov	pc,	lr
GetBaseOfZero
	ldr	r0,	BaseOfZero
	mov	pc,	lr
GetEndOfBSS
	ldr	r0,	EndOfBSS
	mov	pc,	lr
GetPC
    mov r0,pc
    mov pc,lr	
 
;*******************************************************************	

__user_initial_stackheap    
    LDR   r0,=bottom_of_heap ;库函数的堆空间
    MOV   pc,lr
    
        AREA    Myheap, DATA, NOINIT, ALIGN=2
bottom_of_heap     SPACE   1024  ;库函数的堆空间初始化
                                 ;Byte	
	
	END		
		

⌨️ 快捷键说明

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