Откуда эти команды берутся
Какие команды? Такого понятия в языке Си нет. Есть понятие операторов - арифметических, логических, операторов цикла, условия, перехода и т.п. Все эти операторы прописаны в документации языка. Книжка
"Язык программирования Си" авторов Керниган, Ритчи - в помощь!
Далее, написанный нами текст по команде Build начинает анализироваться компилятором: он сканирует построчно каждую букву, каждое написанное слово или цифру, знак, сопоставляя со своими внутренними шаблонами (это называется "синтаксический разбор текста") и постепенно, шаг за шагом преобразует в машинные инструкции, понятные микроконтроллеру, а сопомощник компилятора - линкер - раскладывает блоки инструкций и данных в нужном порядке. Ну а микроконтроллер уже просто исполняет машинные инструкции, не задумываясь, что там было написано.
как понимает <...> микроконтроллер
А вот так:
в ячейке флеш-памяти хранится двоичное число [0000'1000'0100'0100] (или 0x0844 в хекс-виде), представляющее собой инструкцию сложения двух чисел, хранящихся в регистрах АЛУ (арифметико-логического устройства) микроконтроллера. Это число извлекается из флеша, декодируется и исполняется. Каждый бит этого числа устанавливает различные переключатели внутренней логики АЛУ, наподобие того, как работают путевые стрелки на огромной железнодорожной станции.
Машинная инструкция 0x0844 имеет текстовый эквивалент в понятной человеку форме и записывается на языке ассемблера так:
add r0, r1. Ну а если брать язык Си, то показанная инструкция будет выполнять то же действие, что и арифметический оператор "+" сложения двух переменных. То есть, компилятор языка Си преобразовал оператор "+" в машинную инструкцию, показанную выше. И поскольку вариантов АРМ-инструкций довольно много, компилятор всегда учитывает не только оператор "+", но и то, что вокруг него стоит и выбирает наиболее подходящий вариант инструкции сложения, основываясь на заложенных в него шаблонах и алгоритмах преобразования.