1、*17 ;鯡 tasm.exe 默18 GBLL THUMBCODE19 CONFIG = 16 20 THUMBCODE SETL TRUE21 CODE3222 | 23 THUMBCODE SETL FALSE24 25 26 THUMBCODE27 CODE32 ;for start-up code for Thumb mode28 29 30 ;*31 AREA SelfBoot, CODE, READONLY32 33 IMPORT UDF_INS_VECTOR34 IMPORT SWI_SVC_VECTOR35 IMPORT INS_ABT_VECTOR36 IMPORT DAT
2、_ABT_VECTOR37 IMPORT IRQ_SVC_VECTOR38 IMPORT FIQ_SVC_VECTOR 39 40 ENTRY 41 IF :DEF: |ads$version|42 ELSE43 EXPORT _main44 _main45 ENDIF 46 ResetEntry47 b SYS_RST_HANDLER48 b UDF_INS_HANDLER49 b SWI_SVC_HANDLER50 b INS_ABT_HANDLER51 b DAT_ABT_HANDLER52 b .53 b IRQ_SVC_HANDLER54 b FIQ_SVC_HANDLER55 56
3、 ;57 MACRO 58 $Label HANDLER $Vector59 $Label60 sub lr, lr, #4 61 stmfd sp!, r0-r3, lr 62 ldr r0, =$Vector63 ldr pc, r064 ldmfd sp!, r0-r3, pc 65 MEND66 67 UDF_INS_HANDLER68 stmfd sp!, r0-r3, lr69 ldr r0, =UDF_INS_VECTOR70 mov lr, pc71 ldr pc, r072 ldmfd sp!, r0-r3, pc73 SWI_SVC_HANDLER74 stmfd sp!7
4、5 ldr r0, =SWI_SVC_VECTOR76 mov lr, pc77 ldr pc, r078 ldmfd sp!79 INS_ABT_HANDLER80 sub lr, lr, #481 stmfd sp!82 ldr r0, =INS_ABT_VECTOR83 mov lr, pc84 ldr pc, r085 ldmfd sp!86 DAT_ABT_HANDLER87 sub lr, lr, #488 stmfd sp!89 ldr r0, =DAT_ABT_VECTOR90 mov lr, pc91 ldr pc, r092 ldmfd sp!93 IRQ_SVC_HAND
5、LER94 sub lr, lr, #495 stmfd sp!, r0-r12, lr 96 mrs r0, spsr97 stmfd sp!, r098 ldr r0, =IRQ_SVC_VECTOR99 ldr pc, r0 100 FIQ_SVC_HANDLER101 sub lr, lr, #4102 stmfd sp!103 mrs r0, spsr104 stmfd sp!105 ldr r0, =IRQ_SVC_VECTOR106 ldr pc, r0107 108 ;*109 SYS_RST_HANDLER110 mrs r0, cpsr ;enter svc mode an
6、d disable irq,fiq111 bic r0, r0, #ModeMask112 orr r0, r0, #(SVC32Mode :OR: IRQ_BIT : FIQ_BIT)113 msr cpsr_c, r0114 115 IMPORT InitSystem116 bl InitSystem 117 118 adr r0, ResetEntry119 mov r3, #(RamBaseAddr16)120 ldr r1, BaseOfROM 121 ldr r2, TopOfROM 122 add r1, r1, r3123 add r2, r2, r3124 0 125 ldm
7、ia r0!, r4-r11126 stmia r1!127 cmp r1, r2128 bcc %B0129 130 sub r1, r1, r2131 sub r0, r0, r1 132 ldr r1, BaseOfBSS133 ldr r2, BaseOfZero134 add r1, r1, r3 135 add r2, r2, r3 136 1 137 cmp r1, r2 138 ldrcc r4, r0, #4139 strcc r4, r1, #4 140 bcc %B1141 142 mov r0, #0143 ldr r2, EndOfBSS144 add r2, r2,
8、 r3145 3 146 cmp r1, r2147 strcc r0, r1, #4148 bcc %B3 149 150 IMPORT RemapMemory 151 152 adr r0, ResetEntry153 ldr r1, =RemapMemory 154 ldr r2, BaseOfROM155 sub r2, r1, r2156 add r0, r0, r2157 add r1, r2, r3158 mov r2, #32159 0 160 ldr r3, r0, #4161 str r3, r1, #4162 subs r2, r2, #1163 bne %B0164 1
9、65 ldr lr, GotoMain 166 b RemapMemory 167 168 GotoMain DCD $MainEntry169 170 ;*171 IMPORT |Image$RO$Base| ; ROM code start 172 IMPORT |Image$RO$Limit| ; RAM data starts after ROM program173 IMPORT |Image$RW$Base| ; Pre-initialised variables174 IMPORT |Image$ZI$Base| ; uninitialised variables175 IMPO
10、RT |Image$ZI$Limit| ; End of variable RAM space176 177 BaseOfROM DCD |Image$RO$Base|178 TopOfROM DCD |Image$RO$Limit|179 BaseOfBSS DCD |Image$RW$Base|180 BaseOfZero DCD |Image$ZI$Base|181 EndOfBSS DCD |Image$ZI$Limit|182 183 ;184 TIP_SIZE EQU 256185 186 IMPORT ResetMemSet187 EXPORT trans_to_boot188
11、trans_to_boot189 mov lr, r1 ; a2 = r1 190 ldr r1, =ResetMemSet191 ldr r2, BaseOfROM192 sub r2, r1, r2193 add r0, r0, r2 ; a1 = r0194 mov r2, #TIP_SIZE195 0 196 ldr r3, r1, #4197 str r3, r0, #4198 subs r2, r2, #1199 bne %B0200 201 sub r0, r0, #TIP_SIZE*4202 mov pc, r0 203 204 ;205 206 END 1.1.1. 宏定义行
12、1定义了CPSR中表示模式位的5位。行2-7定义了6种处理器模式(除system模式)对应的CPSR位。行8-7定义了CPSR中FIQ与IRQ置位。行10、12为注释,行11定义了一个宏,&的意义等于DCD伪指令,其分配一个字的内存,并用100初始化该字的内存,并使用RomBaseAddr标志这段内存的实际地址。1.1.2. 宏定义行13-15声明了一个字符串变量MainEntry,并将其设置为”main”,并引入外部符号”main”。1.1.3. 判断是否是thumb指令行18声明了逻辑变量THUMBCODE行19-24执行了一个IF ELSE ENDIF指令,CONFIG变量是1中第88页
13、说明的汇编器域定义变量,如果其为32则说明本文件采用ARM汇编器,相应地把THUMBCODE设置为FALSE,若为16则是使用thumb汇编器,相应地把THUMBCODE设置为TRUE。行26-28,强制执行32位的ARM指令,感觉很奇怪,应该是用CODE16命令才对。1.1.4. 定义新程序、引入新符号行31定义了一个新的程序段SelfBoot。行33-38引入了一系列的符号,这些符号在sysinit.s中定义并导出。1.1.5. 定义新程序、引入新符号行40首先声明了程序的入口根据1中第89页的说明,行41-45判断程序是给ADS还是SDT执行的,如果是如果是SDT,则导出_main符号,
14、并开始定义_main函数的开始。1.1.6. 定义系统异常向量表行46-54定义了系统异常处理向量表,并在vector.o首次执行时首先执行行47的代码。1.1.7. 程序跳转宏定义行57-65定义了一个有1个参数的宏HANDLER,该宏实现程序跳转,跳转到$Vector所指向内存所保存的内存地址的值,执行完该函数后,恢复现场,并返回原来的状态。1.1.8. 异常处理程序定义行67-166定义了7种模式异常的处理函数具体地:UDF_INS_HANDLER 执行UDF_INS_VECTOR内存所保存的指令后,返回到异常发生之前的状态。类似,SWI_SVC_HANDLER, INS_ABT_HAN
15、DLER, DAT_ABT_HANDLER, IRQ_SVC_HANDLER, FIQ_SVC_HANDLER也执行类似的操作,执行XX_XX_VECTOR内存所保存的指令,然后返回到异常发生之前的状态。SYS_RST_HANDLER异常处理程序与其它异常处理程序有很大不同,行110-113使得处理器进入SVC模式,并且禁止FIQ与IRQ。行115-116使得程序跳转到sysinit.s中定义的InitSystem函数中执行,并在执行结束后返回。InitSystem函数的作用是进行内存、堆栈、LED端口、串口、定时器以及中断的初始化工作,具体讲解请参见sysinit.s中的分析(1.2.12)
16、。行118将异常向量表ResetEntry的地址保存入r0。行119-128将bootloader的RO段拷贝入内存。行130-140将bootloader的RW段拷贝入内存。行142-148将内存中的ZI段初始化为0。行150-163将RemapMemory函数拷贝入内存中。行165将返回地址进行设置。行166执行RemapMemory函数(在sysinit.s中定义),RemapMemory函数主要是设置ROMCON0、ROMCON1和DRAMCON0、DRAMCON1;并将IRQ_SERVICE函数的地址存入一个内存中的数组中。RemapMemory函数执行完后将跳入bios.c中定义的main函数。1.1.9. 声明C主函数程序入口行168声明了GotoMain标号,其被定义为变量$MainEntry的值“main”1.1.10. 定义vector.s中需要用到的连接器变量根据文献2第56-57页中的说明,行170-181引入了由连接器预定义的变量值。173 IMPORT
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1