Подтвердить что ты не робот

GCC: запретить использование некоторых регистров

Это странная просьба, но я чувствую, что это возможно. Я хотел бы вставить некоторые прагмы или директивы в области моего кода (написанные на языке C), чтобы распределитель регистров GCC не использовал их.

Я понимаю, что могу сделать что-то подобное, что может отложить этот регистр для этой переменной

register int var1 asm ("EBX") = 1984;
register int var2 asm ("r9") = 101;

Проблема в том, что я вставляю новые инструкции (для аппаратного симулятора) напрямую, а GCC и GAS еще не распознают их. Мои новые инструкции могут использовать существующие регистры общего назначения, и я хочу убедиться, что некоторые из них (т.е. R12- > r15) зарезервированы.

Сейчас я работаю в среде макета, и я хочу быстро выполнить свои эксперименты. В будущем я добавлю GAS и добавлю встроенные функции в GCC, но прямо сейчас я ищу быстрое исправление.

Спасибо!

4b9b3361

Ответ 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 затем избежит использования этих регистров или, по крайней мере, сохранит и перезагрузит их содержимое.