Цитата(Twen @ Feb 28 2011, 13:22)

Согласен, но почему же не с main-а стартует? И если, кто-то знаком с ассемблером стм, то дайте ссылки на какую-то книгу по ассемблеру для стм, заранее спасибо )
А почему не указывается адрес вектора прерывания?
Joseph Yiu. The Definitive Guide to the ARM Cortex-M3, 2 Ed (2010)
здесь имеется, но доверие нужно заслужить
Сами вектора прерываний заданы в начале startup_*.s
А адрес обработчика подставляется командой DCD
Код
DCD SysTick_Handler ; SysTick Handler
Потом идет обработчик-заглушка. Зацикленный на себя код.
Код
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Но в другом файле (*_it.c обычно) можно создать другой обработчик прерывания, на c. Который и будет скомпилирован и собран в проект.
До перехода в main() выполняются две функции. Функция
__main копирует code и data, копирует или декомпрессирует RW data, инициализирует нулями ZI дата. Затем функция
__rt_entry устанавливает stack и heap, инициализирует библиотечные функции, вызывает конструкторы верхнего уровня C++ (а также выходит из приложения после окончания работы основной программы). После этого вызывается функция main.
Так написано в DUI0471C_developing_for_arm_processors.pdf
Который (и кучу других) можно скачать с сайта ARM.