9.3. 限制符volatile
使用volatile限制符的内嵌汇编通常不会被GCC编译器优化删除或重排。GCC内置了多种优化能力(使用-O相关参数时生效)。例如,当编译器发现asm()中的输出操作数没有被当前程序上下文使用时,可能认为这段内嵌汇编是冗余代码并将其删除;当发现循环体中的内嵌汇编总是返回相同结果时,也可能把它移动到循环体外部。如果这些优化不是预期行为,可以使用volatile通知编译器保留该内嵌汇编。例如,在程序中插入断点指令进行调试时,通常写为:
asm volatile("break 0\n\t");
如果这段内嵌汇编没有volatile修饰,且内部只有一条break 0指令,又没有与当前函数中的有效变量产生关联(也就是没有明显数据依赖),那么GCC在编译过程中很可能将其优化掉,导致生成的.o二进制文件中不存在break 0指令。