ARM Assembly Vector table 定义 - 为什么要这样定义向量?
ARM Assembly Vector table definition - why vector defined this way?
我正在检查 STM32F1 的启动汇编代码,有些东西让我很困惑
这是代码
.syntax unified
.arch armv7-m
.thumb
/* Initial vector table */
.section "vectors"
.long _STACK_TOP /* Top of Stack */
.long _reset_Handler /* Reset Handler */
.long _NMI_Handler /* NMI Handler */
.long _HardFault_Handler /* Hard Fault Handler */
.long _MemManage_Handler /* Reserved */
.long _BusFault_Handler /* Reserved */
.long _UsageFault_Handler /* Reserved */
.long 0 /* Reserved */
.long 0 /* Reserved */
.long 0 /* Reserved */
.long 0 /* Reserved */
.long _SVCall_Handler /* SVCall Handler */
.long _DebugMonitor_Handler /* Reserved */
.long 0 /* Reserved */
.long _PendSV_Handler /* PendSV Handler */
.long _SysTick_Handler /* SysTick Handler */
# Some memory setup code
.macro def_rewritable_handler handler
.thumb_func
.weak \handler
.type \handler, %function
\handler: b . @@ Branch forever in default state
.endm
def_rewritable_handler _NMI_Handler /* NMI HANDLER */
def_rewritable_handler _HardFault_Handler /* HARD FAULT Handler */
def_rewritable_handler _MemManage_Handler /* Reserved */
def_rewritable_handler _BusFault_Handler /* Reserved */
def_rewritable_handler _UsageFault_Handler /* Reserved */
def_rewritable_handler _SVCall_Handler /* SVCALL Handler */
def_rewritable_handler _PendSV_Handler /* PENDSV Handler */
def_rewritable_handler _SysTick_Handler /* SYSTICK Handler */
def_rewritable_handler _DebugMonitor_Handler /* Reserved */
def_rewritable_handler _WWDG_IRQHandler /* WWDG_IRQHandler */
def_rewritable_handler _PVD_IRQHandler /* PVD_IRQHandler */
def_rewritable_handler _TAMPER_IRQHandler /* TAMPER_IRQHandler */
def_rewritable_handler _RTC_IRQHandler /* RTC_IRQHandler */
def_rewritable_handler _FLASH_IRQHandler /* FLASH_IRQHandler */
def_rewritable_handler _RCC_IRQHandler /* RCC_IRQHandler */
def_rewritable_handler _EXTI0_IRQHandler /* EXTI0_IRQHandler */
def_rewritable_handler _EXTI1_IRQHandler /* EXTI1_IRQHandler */
def_rewritable_handler _EXTI2_IRQHandler /* EXTI2_IRQHandler */
def_rewritable_handler _EXTI3_IRQHandler /* EXTI3_IRQHandler */
def_rewritable_handler _EXTI4_IRQHandler /* EXTI4_IRQHandler */
def_rewritable_handler _DMA1_Channel1_IRQHandler /* DMA1_Channel1_IRQHandler */
def_rewritable_handler _DMA1_Channel2_IRQHandler /* DMA1_Channel2_IRQHandler */
def_rewritable_handler _DMA1_Channel3_IRQHandler /* DMA1_Channel3_IRQHandler */
def_rewritable_handler _DMA1_Channel4_IRQHandler /* DMA1_Channel4_IRQHandler */
def_rewritable_handler _DMA1_Channel5_IRQHandler /* DMA1_Channel5_IRQHandler */
def_rewritable_handler _DMA1_Channel6_IRQHandler /* DMA1_Channel6_IRQHandler */
def_rewritable_handler _DMA1_Channel7_IRQHandler /* DMA1_Channel7_IRQHandler */
def_rewritable_handler _ADC1_2_IRQHandler /* ADC1_2_IRQHandler */
def_rewritable_handler _USB_HP_CAN1_TX_IRQHandler /* USB_HP_CAN1_TX_IRQHandler */
def_rewritable_handler _USB_LP_CAN1_RX0_IRQHandler /* USB_LP_CAN1_RX0_IRQHandler */
def_rewritable_handler _CAN1_RX1_IRQHandler /* CAN1_RX1_IRQHandler */
def_rewritable_handler _CAN1_SCE_IRQHandler /* CAN1_SCE_IRQHandler */
def_rewritable_handler _EXTI9_5_IRQHandler /* EXTI9_5_IRQHandler */
def_rewritable_handler _TIM1_BRK_IRQHandler /* TIM1_BRK_IRQHandler */
def_rewritable_handler _TIM1_UP_IRQHandler /* TIM1_UP_IRQHandler */
def_rewritable_handler _TIM1_TRG_COM_IRQHandler /* TIM1_TRG_COM_IRQHandler */
def_rewritable_handler _TIM1_CC_IRQHandler /* TIM1_CC_IRQHandler */
def_rewritable_handler _TIM2_IRQHandler /* TIM2_IRQHandler */
def_rewritable_handler _TIM3_IRQHandler /* TIM3_IRQHandler */
def_rewritable_handler _I2C1_EV_IRQHandler /* I2C1_EV_IRQHandler */
def_rewritable_handler _I2C1_ER_IRQHandler /* I2C1_ER_IRQHandler */
def_rewritable_handler _SPI1_IRQHandler /* SPI1_IRQHandler */
def_rewritable_handler _USART1_IRQHandler /* USART1_IRQHandler */
def_rewritable_handler _USART2_IRQHandler /* USART2_IRQHandler */
def_rewritable_handler _EXTI15_10_IRQHandler /* EXTI15_10_IRQHandler */
def_rewritable_handler _RTCAlarm_IRQHandler /* RTCAlarm_IRQHandler */
def_rewritable_handler _USBWakeUp_IRQHandler /* USBWakeUp_IRQHandler */
.end
据我所知,.long分配4个字节的内存,经常在它前面使用一个标签来标记它的内存位置。但是后面有.long go with a label,这些label有的可以在这个文件里面找到,有的没有
我试过 google 这种语法但什么也没找到,请给我一些解释
.long symbol_name
发出 4 个字节,其值 = 该符号的绝对地址。 (正如@Erik 在评论中解释的那样。)
这就像您写 bl symbol
- 它是对该符号的 引用 ,而不是定义。
例如在 C 中,int foo = bar;
仅定义 foo
,而不定义 bar
.
A label 是当 name:
是一行中的第一件事时,并定义一个符号(地址 = 标签的位置)。
.long name
不是 标签,只是对符号的引用(应该由其他地方的标签定义,或者只是在链接描述文件中设置。 )
x: .long y
会将标签 x
放在包含值 y
.
的字的起始地址
我正在检查 STM32F1 的启动汇编代码,有些东西让我很困惑 这是代码
.syntax unified
.arch armv7-m
.thumb
/* Initial vector table */
.section "vectors"
.long _STACK_TOP /* Top of Stack */
.long _reset_Handler /* Reset Handler */
.long _NMI_Handler /* NMI Handler */
.long _HardFault_Handler /* Hard Fault Handler */
.long _MemManage_Handler /* Reserved */
.long _BusFault_Handler /* Reserved */
.long _UsageFault_Handler /* Reserved */
.long 0 /* Reserved */
.long 0 /* Reserved */
.long 0 /* Reserved */
.long 0 /* Reserved */
.long _SVCall_Handler /* SVCall Handler */
.long _DebugMonitor_Handler /* Reserved */
.long 0 /* Reserved */
.long _PendSV_Handler /* PendSV Handler */
.long _SysTick_Handler /* SysTick Handler */
# Some memory setup code
.macro def_rewritable_handler handler
.thumb_func
.weak \handler
.type \handler, %function
\handler: b . @@ Branch forever in default state
.endm
def_rewritable_handler _NMI_Handler /* NMI HANDLER */
def_rewritable_handler _HardFault_Handler /* HARD FAULT Handler */
def_rewritable_handler _MemManage_Handler /* Reserved */
def_rewritable_handler _BusFault_Handler /* Reserved */
def_rewritable_handler _UsageFault_Handler /* Reserved */
def_rewritable_handler _SVCall_Handler /* SVCALL Handler */
def_rewritable_handler _PendSV_Handler /* PENDSV Handler */
def_rewritable_handler _SysTick_Handler /* SYSTICK Handler */
def_rewritable_handler _DebugMonitor_Handler /* Reserved */
def_rewritable_handler _WWDG_IRQHandler /* WWDG_IRQHandler */
def_rewritable_handler _PVD_IRQHandler /* PVD_IRQHandler */
def_rewritable_handler _TAMPER_IRQHandler /* TAMPER_IRQHandler */
def_rewritable_handler _RTC_IRQHandler /* RTC_IRQHandler */
def_rewritable_handler _FLASH_IRQHandler /* FLASH_IRQHandler */
def_rewritable_handler _RCC_IRQHandler /* RCC_IRQHandler */
def_rewritable_handler _EXTI0_IRQHandler /* EXTI0_IRQHandler */
def_rewritable_handler _EXTI1_IRQHandler /* EXTI1_IRQHandler */
def_rewritable_handler _EXTI2_IRQHandler /* EXTI2_IRQHandler */
def_rewritable_handler _EXTI3_IRQHandler /* EXTI3_IRQHandler */
def_rewritable_handler _EXTI4_IRQHandler /* EXTI4_IRQHandler */
def_rewritable_handler _DMA1_Channel1_IRQHandler /* DMA1_Channel1_IRQHandler */
def_rewritable_handler _DMA1_Channel2_IRQHandler /* DMA1_Channel2_IRQHandler */
def_rewritable_handler _DMA1_Channel3_IRQHandler /* DMA1_Channel3_IRQHandler */
def_rewritable_handler _DMA1_Channel4_IRQHandler /* DMA1_Channel4_IRQHandler */
def_rewritable_handler _DMA1_Channel5_IRQHandler /* DMA1_Channel5_IRQHandler */
def_rewritable_handler _DMA1_Channel6_IRQHandler /* DMA1_Channel6_IRQHandler */
def_rewritable_handler _DMA1_Channel7_IRQHandler /* DMA1_Channel7_IRQHandler */
def_rewritable_handler _ADC1_2_IRQHandler /* ADC1_2_IRQHandler */
def_rewritable_handler _USB_HP_CAN1_TX_IRQHandler /* USB_HP_CAN1_TX_IRQHandler */
def_rewritable_handler _USB_LP_CAN1_RX0_IRQHandler /* USB_LP_CAN1_RX0_IRQHandler */
def_rewritable_handler _CAN1_RX1_IRQHandler /* CAN1_RX1_IRQHandler */
def_rewritable_handler _CAN1_SCE_IRQHandler /* CAN1_SCE_IRQHandler */
def_rewritable_handler _EXTI9_5_IRQHandler /* EXTI9_5_IRQHandler */
def_rewritable_handler _TIM1_BRK_IRQHandler /* TIM1_BRK_IRQHandler */
def_rewritable_handler _TIM1_UP_IRQHandler /* TIM1_UP_IRQHandler */
def_rewritable_handler _TIM1_TRG_COM_IRQHandler /* TIM1_TRG_COM_IRQHandler */
def_rewritable_handler _TIM1_CC_IRQHandler /* TIM1_CC_IRQHandler */
def_rewritable_handler _TIM2_IRQHandler /* TIM2_IRQHandler */
def_rewritable_handler _TIM3_IRQHandler /* TIM3_IRQHandler */
def_rewritable_handler _I2C1_EV_IRQHandler /* I2C1_EV_IRQHandler */
def_rewritable_handler _I2C1_ER_IRQHandler /* I2C1_ER_IRQHandler */
def_rewritable_handler _SPI1_IRQHandler /* SPI1_IRQHandler */
def_rewritable_handler _USART1_IRQHandler /* USART1_IRQHandler */
def_rewritable_handler _USART2_IRQHandler /* USART2_IRQHandler */
def_rewritable_handler _EXTI15_10_IRQHandler /* EXTI15_10_IRQHandler */
def_rewritable_handler _RTCAlarm_IRQHandler /* RTCAlarm_IRQHandler */
def_rewritable_handler _USBWakeUp_IRQHandler /* USBWakeUp_IRQHandler */
.end
据我所知,.long分配4个字节的内存,经常在它前面使用一个标签来标记它的内存位置。但是后面有.long go with a label,这些label有的可以在这个文件里面找到,有的没有 我试过 google 这种语法但什么也没找到,请给我一些解释
.long symbol_name
发出 4 个字节,其值 = 该符号的绝对地址。 (正如@Erik 在评论中解释的那样。)
这就像您写 bl symbol
- 它是对该符号的 引用 ,而不是定义。
例如在 C 中,int foo = bar;
仅定义 foo
,而不定义 bar
.
A label 是当 name:
是一行中的第一件事时,并定义一个符号(地址 = 标签的位置)。
.long name
不是 标签,只是对符号的引用(应该由其他地方的标签定义,或者只是在链接描述文件中设置。 )
x: .long y
会将标签 x
放在包含值 y
.