2015-07-01 4 views
0

Я работаю над загрузчиком для архитектуры процессора, которая основана на 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 

ответ

0

Поместите l.cust1 в том же инлайн заявлении ассемблера как скачок, который должен быть объявлен volatile как он имеет побочные эффекты и имеет "memory" в списке затирать, как это зависит от содержимого памяти.

+0

Да, после ответа @esm, я подумал, что мне, вероятно, тоже придется прыгать в встроенном ассемблере. Я буду обновляться здесь, как только у меня будет время проверить решение. – matou

0

Вы должны использовать asm volatile и искусственную зависимость от кода, который вы хотите, чтобы встроенная сборка продолжалась. Пример взят из gcc documentation is below:

asm volatile ("mtfsf 255,%1" : "=X"(sum): "f"(fpenv)); 
sum = x + y; 

Согласно документации volatile только не хватает. Другими словами, компилятор еще может изменить порядок следующий код:

asm volatile("mtfsf 255,%0" : : "f" (fpenv)); 
sum = x + y; 

Добавляя зависимость вы обеспечить размещение встроенного ассемблера. В первом фрагменте кода, добавляя зависимость от sum, обеспечивается, что компилятор не будет изменять порядок кода, поскольку он полагает, что он будет генерировать другой результат из-за зависимости. Вы можете найти другой пример этого на this webpage в разделе «Оптимизация кода кода».

Смежные вопросы