Это довольно зависит от системы. В большинстве случаев ответ будет отрицательным - вам нужно написать какую-то пользовательскую сборку, чтобы настроить среду выполнения C перед тем, как вы начнете запускать код C. Однако есть некоторые исключения. Например, ARM Cortex-M0 может выполнять код C сразу после сброса.
Предположительно, однако, вы не используете M0, поэтому вам нужно написать какую-то сборку. Опять же, это зависит от системы / микросхемы, но вам, возможно, удастся сделать что-то простое:
reset_vector:
mov sp, SOME_KNOWN_GOOD_STACK_ADDRESS
call c_entry_point
, который просто инициализирует указатель стека и вызывает точку входа вашей C-программы. Конечно, эта простая установка зависит от того, есть ли у вашего чипа таблица векторов / векторов сброса, которая его поддерживает, ОЗУ (или что-то вроде ОЗУ) инициализируется до вызова вектора сброса и так далее. В ранней инициализации системы, как правило, много «ошибок».
Подготовьтесь к тому, чтобы довольно дружелюбно относиться к документации по компилятору, ассемблеру и компоновщику - создание плоского двоичного файла, который вы можете записать в виде загрузчика первого этапа, само по себе часто является большой болью.
Удачи!