Как инициализировать переменную глобального регистра GNU C - PullRequest
1 голос
/ 10 октября 2019

Переменные глобального регистра GNU C не могут иметь инициализаторы. Это не скомпилируется как C или C ++:

// at global scope.
register int i asm ("r12") = 10;

дает ( Godbolt ) error: global register variable has initial value. Локальная область видимости, конечно, хорошо, но переменные регистров GNU C local - это совсем другое. (Только гарантированно что-либо делать с точки зрения взаимодействия с расширенными asm() операторами.)

Код

#include<stdio.h>
register int i asm ("r12");  //how to initialize i here?
int main()
{
    i=10;            // Would rather avoid this workaround
    printf("%d\n",i);
}

Как инициализировать i в глобальной области видимости,не дожидаетесь, пока вершина главного?

1 Ответ

3 голосов
/ 10 октября 2019

Вы не можете инициализировать глобальную переменную регистра.

В документации GCC говорится следующее:

Глобальные переменные регистра не могут иметь начальные значения, потому чтоисполняемый файл не имеет средств для предоставления начального содержимого для регистра.

Также обратите внимание на параграф ниже:

При выборе регистра выберите тот, который обычно сохраняется и восстанавливаетсяпо вызовам функций на вашей машине. Это гарантирует, что код, который не знает об этом резервировании (например, библиотечные процедуры), восстановит его перед возвратом.

Не следует использовать r12, он не сохраняется между вызовами.

...