http://blog.chinaunix.net/uid/26435987/frmd/151967.html
启动代码主要是在主程序运行之前初始化系统硬件及软件的运行环境,它的主要功能包括以下的几个方面:
1、建立中断向量表
2、初始化系统堆栈
3、应用程序执行环境初始化
4、跳转至主函数
第一部分
GET option.inc ;option.inc文件包含了开发板的配置信息—堆栈、时钟等
GET memcfg.inc ;存储控制文件
GET 2440addr.inc ;寄存器地址地址定义
注意: 汇编不能使用include包含头文件,所有用Get,功能:引进一个被编译过的文件
汇编也不认识*.h 文件,所有只能用*.inc
第二部分
;EQU为程序中的常量、标号等定义一个等效的字符名称,相当于C语言中的define
;定义SDRAM工作在Refresh模式,SDRAM有两种刷新方式:autorefresh和selfrefresh,前者是在其使用过程当中每隔一段时间发出刷新指令,SDRAM刷新一行,selfrefresh是在省电模式时使用。标示:REFRESH寄存器[22]bit : 0- auto refresh; 1 - self refresh
BIT_SELFREFRESH EQU (1<<22) ;用于节电模式中,SDRAM自刷新标志位
第三部分(简单略过)
;系统的工作模式设定,共七种工作模式
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;设置6种工作模式的堆栈的起始地址
;在option.inc中定义了_STACK_BASEADDRESS EQU 0x33ff8000
UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~
SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~
UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~
AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~
IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~
FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~
第四部分:
;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
; 判断是否THUMB指令
; [ 代表IF,| 指的是ELSE,] 相当于ENDIF
GBLL THUMBCODE ;定义一个全局的逻辑变量,变量名为THUMBCODE
[ {CONFIG} = 16 ;如果是CONFIG}= 16,表明现在处于thumb状态
THUMBCODE SETL {TRUE} ;将该变量赋值为真,表示告诉系统当前想用Thumb,但实际启动时不行,只能从ARM启动后再跳转到thumb
CODE32 ;启动时强制使用32 位ARM编译模式
|
THUMBCODE SETL {FALSE};如果系统要求是ARM 指令,则直接设置THUMBCODE
为false ,说明当前的是32 位编译模式
]
;宏定义MOV_PC_LR,作用:子程序返回
MACRO ;宏定义
MOV_PC_LR
[ THUMBCODE ;目标地址是THUMB指令
bx lr ;在ARM模式中,要用BX指令跳转到THUMB指令,并转换模式
|
mov pc,lr ;如果目标地址是ARM指令,则直接把函数返回地址给PC
]
MEND ;宏定义结束
;宏定义MOVEQ_PC_LR,作用:带相等条件判断的子程序返回 。与宏定义
;带条件的函数返回,与MOV_PC_LR类似
MACRO
MOVEQ_PC_LR
[ THUMBCODE
bxeq lr
|
moveq pc,lr
]
MEND ;宏定义结束