Nguyen Minh
Nguyen Minh

Reputation: 15

ARM Assembly Vector table definition - why vector defined this way?

I am inspecting a startup assembly code for STM32F1, and something is making me so confused Here this the code

.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 

As i've learned, .long allocate a memory of 4 bytes, often uses a label before it to mark its memory position. But there .long go with a label afterward, some of these label can be found inside this file, some are not I tried to google for this kind of syntax but found nothing, please give me some explain

Upvotes: 1

Views: 615

Answers (1)

Peter Cordes
Peter Cordes

Reputation: 363980

.long symbol_name emits 4 bytes with value = the absolute address of that symbol. (As @Erik explained in comments.)

This is like when you write bl symbol - it's a reference to that symbol, not a definition.

e.g. in C, int foo = bar; only defines foo, not also bar.


A label is when name: is the first thing on a line, and defines a symbol (with address = position of the label).

.long name is not a label, just a reference to a symbol (which should be defined by a label somewhere else, or just set in a linker script.)

x: .long y would put a label x at the start address of a word containing the value y.

Upvotes: 2

Related Questions