10.6.2 The Volatile Parameter

Compiler optimizations in the presence of Inline Assembler may sometimes have unwanted effects. For example, when an Asm invocation with an input variable is inside a loop, the compiler might move the loading of the input variable outside the loop, regarding it as a one-time initialization.

If you don’t want this to happen, you can disable such optimizations by setting the Volatile parameter to True; for example:

Asm ("movl %0, %%ebx" & LF & HT &
     "movl %%ebx, %1",
     Outputs  => Unsigned_32'Asm_Output ("=g", Var_Out),
     Inputs   => Unsigned_32'Asm_Input  ("g", Var_In),
     Clobber  => "ebx",
     Volatile => True);

By default, Volatile is set to False unless there is no Outputs parameter.

Although setting Volatile to True prevents unwanted optimizations, it also disables other optimizations that might be important for efficiency. In general, you should set Volatile to True only if the compiler’s optimizations have created problems.