volatile 关键字不适用于 gcc 内联汇编

volatile keyword does not work for gcc inline assembly

我需要运行这个简单的内联汇编代码:

#include <stdio.h>

int count;

int main() {

  count = 0;
  for (int i = 0; i < 10; i++) {
    asm volatile ("incl count");  // count++
  }

  printf("count=%d\n", count); 

  return 0;
}

它工作正常(打印计数=10),直到我打开优化(gcc -O1),在这种情况下它打印计数=0。我读到 "volatile" 限定符将阻止优化器将代码置于循环之外。但是这里好像没有作用。

发现问题。我必须将全局变量 "count" 定义为易变的。问题不在于将 asm 块置于循环之外。编译器简单地将 count 替换为 0 in printf.

volatile int count;

int main() {

  count = 0;
  for (int i = 0; i < 10; i++) {
    asm volatile ("incl count");  // count++
  }

  printf("count=%d\n", count); 

  return 0;
}