没有指令的gcc内联asm

时间:2016-02-28 04:43:25

标签: gcc inline-assembly

是"合法"有没有实际指令的gcc内联asm语句?

例如,是asm声明"合法"?它会引入未定义的行为吗?

int main(){
  int *p = something;
  asm("":"=m"(p));
  return 0;
}

2 个答案:

答案 0 :(得分:2)

First

编译没有任何错误,但没有必要:

Last

GCC完全忽略了那个空int main(){ int *p = 0; asm("":"=m"(p)); return 0; } 语句。

答案 1 :(得分:0)

在该具体示例中,编译器可以看到asm(即p)的所有输出都没有被​​使用过。由于asm不是volatile(并且至少有1个输出),编译器可以在优化期间自由地完全丢弃该语句。

也许值得一提的是,在i386上,所有扩展的asm语句(即带有参数的语句)总是隐式地使用clobber fpsr(浮点标志)和eflags(想想:cc clobber)。如果语句未被完全丢弃(例如,如果它是易失性的),则此可能有效。如果是这样,最坏的情况是微小效率损失,而不是错误的结果。

总结一下:

  • 是的,这是合法的。
  • 不,它没有引入未定义的行为除了p的值可能是未定义的,因为你说你正在覆盖内容,但你实际上并没有把任何东西放进去。
  • 从理论上讲,它可以引入微不足道的效率,但它可能不会。