Допустим, я собирался модифицировать ядро манипулятора, чтобы добавить некоторые пользовательские инструкции, и операции, которые я хотел выполнить, были известны во время компиляции (доберется до времени выполнения через секунду).
Я бы использовалассемблер, например:
.globl vecabc
vecabc:
.word 0x7606E600 ;@ special instruction
bx lr
или встроенный в него синтаксис для встроенного компилятора, это усложняет задачу, если вам нужно использовать регистры процессора, например, когда компилятор c заполняет регистры в строкеассемблер, затем ассемблер собирает эти инструкции.Я считаю, что написание фактического asm и просто вставка слов в поток инструкций, как указано выше, только компилятор искажает некоторые байты как данные, а некоторые байты как инструкции, ядро будет видеть их в том порядке, в котором они написаны.
Если вам нужночтобы делать вещи в реальном времени, вы можете использовать самоизменяющийся код, опять же, мне нравится использовать asm для батута.Создайте инструкции, которые вы хотите запустить где-нибудь в оперативной памяти, скажем, по адресу 0x20000000, затем попросите батут вызвать его:
.globl tramp
tramp:
bx r0 ;@ assuming you encoded a return in your instructions
вызовите его с помощью
tramp(0x20000000);
Другой путь, связанный выше, эточтобы изменить ассемблер для добавления новых инструкций, создайте синтаксис для этих инструкций.Тогда вы можете по желанию использовать прямой язык ассемблера или встроенный язык ассемблера, вы не получите компилятор, который будет использовать их без изменения компилятора, что является другим путем после изменения ассемблера.