GCC: запретить использование некоторых регистров
Это странная просьба, но я чувствую, что это возможно. Я хотел бы вставить некоторые прагмы или директивы в области моего кода (написанные на языке C), чтобы распределитель регистров GCC не использовал их.
Я понимаю, что могу сделать что-то подобное, что может отложить этот регистр для этой переменной
register int var1 asm ("EBX") = 1984;
register int var2 asm ("r9") = 101;
Проблема в том, что я вставляю новые инструкции (для аппаратного симулятора) напрямую, а GCC и GAS еще не распознают их. Мои новые инструкции могут использовать существующие регистры общего назначения, и я хочу убедиться, что некоторые из них (т.е. R12- > r15) зарезервированы.
Сейчас я работаю в среде макета, и я хочу быстро выполнить свои эксперименты. В будущем я добавлю GAS и добавлю встроенные функции в GCC, но прямо сейчас я ищу быстрое исправление.
Спасибо!
Ответы
Ответ 1
При написании встроенного ассемблера GCC вы можете указать "список clobber" - список регистров, который может быть перезаписан вашим встроенным кодом ассемблера. Затем GCC будет делать все, что необходимо для сохранения и восстановления данных в этих регистрах (или, во избежание их использования в первую очередь) в течение сегмента inline asm. Вы также можете привязывать регистры ввода или вывода к переменным C.
Например:
inline unsigned long addone(unsigned long v)
{
unsigned long rv;
asm("mov $1, %%eax;"
"mov %0, %%ebx;"
"add %%eax, %%ebx"
: /* outputs */ "b" (rv)
: /* inputs */ "g" (v) /* select unused general purpose reg into %0 */
: /* clobbers */ "eax"
);
}
Для получения дополнительной информации см. GCC-Inline-Asm-HOWTO.
Ответ 2
Если вы используете глобальные явные переменные регистра, они будут зарезервированы во всей единице компиляции и не будут использоваться компилятором для чего-либо еще (он все равно может использоваться системными библиотеками, поэтому выберите то, что будет восстановлено этими). локальные переменные регистра не гарантируют, что ваше значение всегда будет в регистре, но только при использовании кода или в качестве операнда asm
.
Ответ 3
Если вы пишете встроенный блок asm для своих новых инструкций, есть команды, которые сообщают GCC, какие регистры используются этим блоком и как они используются. GCC затем избежит использования этих регистров или, по крайней мере, сохранит и перезагрузит их содержимое.