Изменяемые инструкции
Иногда, оптимизатор компилятора может перехитрить самого себя.
Например, когда инструкция ассемблера с параметром ввода расположена внутри цикла, он может переместить загрузку параметра ввода за пределы цикла, подразумевая, что это одноразовая инициализация.
Если ваш код не допускает такой трактовки (и вы обнаруживаете этот "сюрприз" достаточно быстро, после анализа генерируемого компилятором ассемблерного файла), то вы можете указать компилятору, чтобы он не пытался перехитрить вас путем установки в True параметра Volatile.
Рассмотрим следующий пример:
Asm ("movl %0, %%ebx" & "movl %%ebx, %1", Inputs => Unsigned_32'Asm_Input ("=g", Input), Outputs => Unsigned_32'Asm_Output ("g", Output), Clobber => "ebx", Volatile => True"); |
Примечательно, что по умолчанию параметр Volatile
установлен в False пока не существует ни одного параметра вывода.
В результате демонстрации такого примера, может показаться, что установку параметра Volatile в True
стоит использовать повсеместно.
Однако, необходимо заметить, что такая установка будет блокировать оптимизацию кода.
Следовательно, ее использование реально необходимо только в тех случаях, когда без этой установки возникают какие-либо проблемы.