
.syntax unified .cpu cortex-m23 ; 使用的处理器架构 .fpu softvfp ; 使用的是软件模拟浮点运算 .thumb ; 指示汇编使用thumb指令 .global Default_Handler ; 全局符号。链接器可引用。使其对外可见 /* necessary symbols defined in linker script to initialize data */ ; .word一般占用4个字节 .word _sidata ;Flash 中数据段.data的初始值起始地址通常位于只读存储器。 .word _sdata ;RAM 中数据段.data的起始地址。 .word _edata ;RAM 中数据段.data的结束地址。 .word _sbss ;RAM 中 BSS 段的起始地址。 .word _ebss ;RAM 中 BSS 段的结束地址。 .section .text.Reset_Handler ; 将此后的代码放入名为 .text.Reset_Handler 的节section通常位于 Flash。 .weak Reset_Handler ;声明 Reset_Handler 为弱符号允许用户在同名强符号覆盖如果用户定义了 Reset_Handler 则优先 .type Reset_Handler, %function ;指定该符号为函数类型便于调试器识别。 /* reset Handler */ Reset_Handler: ldr r0, _sp ; _sp栈顶指针拷贝到r0 mov sp, r0 ; 将 r0 的值赋给栈指针 SP完成栈初始化。 /* copy the data segment into ram */ movs r1, #0 ; 将立即数 0 存入 r1用作偏移量从 0 开始 b DataInit ; 无条件跳转到 DataInit 标签用于判断是否需要复制数据 CopyData: ;循环体标签。 ldr r3, _sidata ;将.data起始地址加载到r3 ldr r3, [r3, r1] ;将.data0的4字节数据加载到r3 str r3, [r0, r1] ;将r3的数据存到r0r1 也就是ram的.datar1 adds r1, r1, #4 ;r1r14 每次偏移4字节 ; 执行完成后往下运行 DataInit: ;初始化判断循环条件 ldr r0, _sdata ;将ram的.data的起始地址加载到r0 ldr r3, _edata ;将ram的.data的结束地址加载到r3 adds r2, r0, r1 ;r2 r0 r1 cmp r2, r3 ;比较r2是否小于r3 bcc CopyData ;如果小于那么跳到copydata ldr r2, _sbss ;将ram的bss起始地址加载到r2 b Zerobss ;跳转到zerobss FillZerobss: movs r3, #0 ; 0复制到r3 str r3,[r2] ; 将0赋值到r2指向的地址 adds r2, r2, #4 ; r2地址4 Zerobss: ldr r3, _ebss ; 加载ram的bss结束地址到r3 cmp r2, r3 ; 比较r2所在的地址小于r3那么跳到bss清除的循环里 bcc FillZerobss ; 清除bss /* Call SystemInit function */ bl SystemInit ; 跳转到systeminit,bl 提前将pc4的地址放到LR寄存器里 /* Call static constructors */ bl __libc_init_array ; 调用 C 静态构造函数或 C 库初始化若有用于初始化全局对象。 /*Call the main function */ bl main ; 跳转到用户的主函数 main进入应用程序 bx lr ; 如果main返回那么会跳转到LR所在地址但并不会发生main里是死循环。 .size Reset_Handler, .-Reset_Handler .section .text.Default_Handler,ax,%progbits ;将默认异常处理函数放入 .text.Default_Handler 节属性为“可分配、可执行”ax内容为程序数据%progbits Default_Handler: Infinite_Loop: b Infinite_Loop ;无限循环 .size Default_Handler, .-Default_Handler ;设置这个标签的大小 .section .vectors,a,%progbits ;创建 .vectors 节属性为“可分配”a无执行权限。 .global __gVectors ;声明 __gVectors 全局供链接器识别为向量表起始地址 __gVectors: .word _sp /* Top of Stack */ .word Reset_Handler /* 1:Reset Handler */ .word NMI_Handler /* 2:NMI Handler */ .word HardFault_Handler /* 3:Hard Fault Handler */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word SVC_Handler /* 11:SVCall Handler */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word PendSV_Handler /* 14:PendSV Handler */ .word SysTick_Handler /* 15:SysTick Handler */ /* external interrupts handler */ .word WWDGT_IRQHandler /* 16:Window Watchdog Timer */ .word LVD_IRQHandler /* 17:LVD through EXTI Line detect */ .word RTC_IRQHandler /* 18:RTC through EXTI Line */ .word FMC_IRQHandler /* 19:FMC */ .word RCU_IRQHandler /* 20:RCU */ .word EXTI0_1_IRQHandler /* 21:EXTI Line 0 and EXTI Line 1 */ .word EXTI2_3_IRQHandler /* 22:EXTI Line 2 and EXTI Line 3 */ .word EXTI4_15_IRQHandler /* 23:EXTI Line 4 to EXTI Line 15 */ .word 0 /* Reserved */ .word DMA_Channel0_IRQHandler /* 25:DMA Channel 0 */ .word DMA_Channel1_2_IRQHandler /* 26:DMA Channel 1 and DMA Channel 2 */ .word DMA_Channel3_4_IRQHandler /* 27:DMA Channel 3 and DMA Channel 4 */ .word ADC_CMP_IRQHandler /* 28:ADC and Comparator */ .word TIMER0_BRK_UP_TRG_COM_IRQHandler /* 29:TIMER0 Break,Update,Trigger and Commutation */ .word TIMER0_Channel_IRQHandler /* 30:TIMER0 Channel Capture Compare */ .word 0 /* Reserved */ .word TIMER2_IRQHandler /* 32:TIMER2 */ .word TIMER5_IRQHandler /* 33:TIMER5 */ .word 0 /* Reserved */ .word TIMER13_IRQHandler /* 35:TIMER13 */ .word TIMER14_IRQHandler /* 36:TIMER14 */ .word TIMER15_IRQHandler /* 37:TIMER15 */ .word TIMER16_IRQHandler /* 38:TIMER16 */ .word I2C0_EV_IRQHandler /* 39:I2C0 Event */ .word I2C1_EV_IRQHandler /* 40:I2C1 Event */ .word SPI0_IRQHandler /* 41:SPI0 */ .word SPI1_IRQHandler /* 42:SPI1 */ .word USART0_IRQHandler /* 43:USART0 */ .word USART1_IRQHandler /* 44:USART1 */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word I2C0_ER_IRQHandler /* 48:I2C0 Error */ .word 0 /* Reserved */ .word I2C1_ER_IRQHandler /* 50:I2C1 Error */ .size __gVectors, . - __gVectors .weak NMI_Handler ;定义了弱引用 .thumb_set NMI_Handler,Default_Handler ;如果用户没有实现中断链接器会默认使用Default_Handler也就是死循环防止未定义中断发生时会进入死循环 .weak HardFault_Handler .thumb_set HardFault_Handler,Default_Handler .weak SVC_Handler .thumb_set SVC_Handler,Default_Handler .weak PendSV_Handler .thumb_set PendSV_Handler,Default_Handler .weak SysTick_Handler .thumb_set SysTick_Handler,Default_Handler .weak WWDGT_IRQHandler .thumb_set WWDGT_IRQHandler,Default_Handler .weak LVD_IRQHandler .thumb_set LVD_IRQHandler,Default_Handler .weak TAMPER_IRQHandler .thumb_set TAMPER_IRQHandler,Default_Handler .weak RTC_IRQHandler .thumb_set RTC_IRQHandler,Default_Handler .weak FMC_IRQHandler .thumb_set FMC_IRQHandler,Default_Handler .weak RCU_IRQHandler .thumb_set RCU_IRQHandler,Default_Handler .weak EXTI0_1_IRQHandler .thumb_set EXTI0_1_IRQHandler,Default_Handler .weak EXTI2_3_IRQHandler .thumb_set EXTI2_3_IRQHandler,Default_Handler .weak EXTI4_15_IRQHandler .thumb_set EXTI4_15_IRQHandler,Default_Handler .weak DMA_Channel0_IRQHandler .thumb_set DMA_Channel0_IRQHandler,Default_Handler .weak DMA_Channel1_2_IRQHandler .thumb_set DMA_Channel1_2_IRQHandler,Default_Handler .weak DMA_Channel3_4_IRQHandler .thumb_set DMA_Channel3_4_IRQHandler,Default_Handler .weak ADC_CMP_IRQHandler .thumb_set ADC_CMP_IRQHandler,Default_Handler .weak TIMER0_BRK_UP_TRG_COM_IRQHandler .thumb_set TIMER0_BRK_UP_TRG_COM_IRQHandler,Default_Handler .weak TIMER0_Channel_IRQHandler .thumb_set TIMER0_Channel_IRQHandler,Default_Handler .weak TIMER2_IRQHandler .thumb_set TIMER2_IRQHandler,Default_Handler .weak TIMER5_IRQHandler .thumb_set TIMER5_IRQHandler,Default_Handler .weak TIMER13_IRQHandler .thumb_set TIMER13_IRQHandler,Default_Handler .weak TIMER14_IRQHandler .thumb_set TIMER14_IRQHandler,Default_Handler .weak TIMER15_IRQHandler .thumb_set TIMER15_IRQHandler,Default_Handler .weak TIMER16_IRQHandler .thumb_set TIMER16_IRQHandler,Default_Handler .weak I2C0_EV_IRQHandler .thumb_set I2C0_EV_IRQHandler,Default_Handler .weak I2C1_EV_IRQHandler .thumb_set I2C1_EV_IRQHandler,Default_Handler .weak SPI0_IRQHandler .thumb_set SPI0_IRQHandler,Default_Handler .weak SPI1_IRQHandler .thumb_set SPI1_IRQHandler,Default_Handler .weak USART0_IRQHandler .thumb_set USART0_IRQHandler,Default_Handler .weak USART1_IRQHandler .thumb_set USART1_IRQHandler,Default_Handler .weak I2C0_ER_IRQHandler .thumb_set I2C0_ER_IRQHandler,Default_Handler .weak I2C1_ER_IRQHandler .thumb_set I2C1_ER_IRQHandler,Default_Handler