Я работаю над загрузчиком для архитектуры процессора, которая основана на ORPSoC. Чтобы выполнить программу, загрузчик загружает ее в память и затем переходит к началу этой программы.Как сообщить GCC разместить инструкцию по сборке в конкретной позиции?
Теперь мне нужна специальная инструкция l.cust1
, вставленная в слот задержки прыжка. Эта инструкция реализована процессором и активирует дешифрование следующих инструкций. Вот почему он имеет для размещения в слоте задержки. Позднее, и программа не может быть выполнена, так как ее инструкции зашифрованы. Аналогично, если дешифрование активировано слишком рано, загрузчик сработает, потому что он не зашифрован.
Теперь я задаюсь вопросом, можно ли указать GCC, где разместить инструкцию l.cust1
. В настоящее время мне нужно вручную изменить бинарник загрузчика соответственно.
Вставка ассемблерных __asm__("l.cust1\n\t");
в результатах загрузчика источника C кода в инструкции добавляется где-то до соответствующей скачки:
1fc2e10: 9c 21 01 b4 l.addi r1,r1,436
1fc2e14: 70 00 00 00 l.cust1 # switching on decryption
1fc2e18: 18 40 01 ff l.movhi r2,0x1ff
1fc2e1c: 9c 72 ff ff l.addi r3,r18,-1
1fc2e20: a8 42 7c 94 l.ori r2,r2,0x7c94
1fc2e24: 9c 90 00 04 l.addi r4,r16,4
1fc2e28: 85 62 00 60 l.lwz r11,96(r2)
1fc2e2c: 48 00 58 00 l.jalr r11
1fc2e30: 9d c0 00 00 l.addi r14,r0,0
Однако, мне нужно будет находиться в слоте задержки скачки:
1fc2e10: 9c 21 01 b4 l.addi r1,r1,436
1fc2e14: 9d c0 00 00 l.addi r14,r0,0
1fc2e18: 18 40 01 ff l.movhi r2,0x1ff
1fc2e1c: 9c 72 ff ff l.addi r3,r18,-1
1fc2e20: a8 42 7c 94 l.ori r2,r2,0x7c94
1fc2e24: 9c 90 00 04 l.addi r4,r16,4
1fc2e28: 85 62 00 60 l.lwz r11,96(r2)
1fc2e2c: 48 00 58 00 l.jalr r11
1fc2e30: 70 00 00 00 l.cust1 # switching on decryption
Да, после ответа @esm, я подумал, что мне, вероятно, тоже придется прыгать в встроенном ассемблере. Я буду обновляться здесь, как только у меня будет время проверить решение. – matou