gcc,asm volatile的目的是什么(“”::“r”(x))

时间:2014-07-09 04:37:34

标签: c gcc assembly inline-assembly volatile

我在C源代码中看到过以下代码,在Linux上用于gcc(用于计算机):

extern double prices[4000];

void somefunction()
{
  //this function is called again after each 5 seconds interval

  //some long codes that use prices[]
  // ...

  int i;
  for (i=0; i<4000; i++)
  {
      asm volatile ("" : : "r" (prices[i]));
  }
}

所以我有一些问题:

  1. 这里内联汇编的目的是什么?
  2. 看起来价格[i]是值,它应该是指针吗?
  3. 在我看来,asm代码只是将价格[i]放入寄存器供以后参考,但是,循环次数是4000,这没有意义(计算机没有这么多寄存器)

3 个答案:

答案 0 :(得分:2)

volatile关键字告诉编译器不允许移动此程序集块。

asm ("" ::: "memory")是一个简单的编译器围栏。

来自here

  

您可以通过编写来阻止删除asm指令   关键字volatile在asm之后。 [...] volatile关键字表示   指令有重要的副作用。海湾合作委员会不会删除   volatile asm如果可以访问的话。

答案 1 :(得分:0)

asm volatile强制编译在某个寄存器中加载prices[i](对于每个循环执行都是相同的单个寄存器,你仍然会使用一个寄存器执行4000次循环)。

如果你刚编译asm没有volatile,编译器可以通过删除(或移动)整个语句来优化,然后删除整个循环,因为它什么都不做。

尝试使用

编译foo.c代码
 gcc -O0 -fverbose-asm -S foo.c -o foo-O0.s
 gcc -O1 -fverbose-asm -S foo.c -o foo-O1.s
 gcc -O2 -fverbose-asm -S foo.c -o foo-O2.s
 gcc -O3 -fverbose-asm -S foo.c -o foo-O3.s

使用foo-O*.s关键字

查看生成的less文件(例如使用编辑器或寻呼机,如volatile

答案 2 :(得分:0)

在与编写代码的人讨论后,他说他试图将变量提取到CPU缓存(L1 / L2 / L3)