Пример кода C, который демонстрирует volatile при дизассемблировании?

Что представляет собой короткая иллюстративная программа на C, демонстрирующая разницу между энергозависимой и энергонезависимой при дизассемблировании?

ie

int main()
{
    volatile int x;

    ???
}

vs

int main()
{
    int x;

    ???
}

На что мы можем заменить оба ???, чтобы сгенерированный код был другим?


person Andrew Tomazos    schedule 03.11.2012    source источник


Ответы (3)


Например:

x = 0;

Если x не является volatile, компилятор увидит, что он не используется, и, вероятно, полностью удалит его (либо оператор x = 0;, либо даже саму переменную) из сгенерированного кода в качестве оптимизации.

Однако ключевое слово volatile предназначено именно для того, чтобы предотвратить это от компилятора. По сути, оно сообщает генератору кода: «Что бы вы ни думали об этой переменной, не сомневайтесь, она мне нужна». Таким образом, компилятор будет обрабатывать изменчивую переменную как доступную и выдавать фактический код, соответствующий выражению.

person Community    schedule 03.11.2012
comment
Я только что проверил это, и вы правы. Хранилище x = 0 устраняется в энергонезависимой версии в gcc -O2, тогда как в энергозависимой версии его нет. - person Andrew Tomazos; 03.11.2012
comment
ты прав - я всегда прав. (ДК) :P Не за что. - person ; 03.11.2012
comment
Это ошибка поспешных обобщений от частного к общему. :) - person Andrew Tomazos; 03.11.2012
comment
@AndrewTomazos-Fathomling Но ладно, это разрешено, поскольку мы ученые, верно? :D - person ; 03.11.2012
comment
Я согласен с вами при условии, что вы имеете в виду прямо противоположное тому, что только что сказали, т.е. это специально запрещено именно потому, что мы ученые. :)) - person Andrew Tomazos; 03.11.2012
comment
@AndrewTomazos-Fathomling Почувствуйте ветерок сарказма в моем комментарии. ;-) - person ; 03.11.2012

Это может быть не самый короткий пример, но это обычное использование volatile во встроенных системах, предполагая, что x указывает на адрес регистра, если volatile не используется, компилятор примет значение x не изменится и удалит цикл:

volatile long *x = (long*) REGISTER_BASE;
while (!(x&0x01)) {
   //do nothing;
}
person iabdalkader    schedule 03.11.2012

Вы также можете попробовать это:

x=1;
x=2;
return x;

Включите оптимизацию и проверьте дизассемблирование для обоих.

person dbrank0    schedule 03.11.2012