内联asm是ANSI C标准的一部分吗?

时间:2012-12-13 23:39:37

标签: c++ c inline-assembly

我一直认为这是因为许多IDE和语法突出显示工具都没有在C中突出显示ASM,但它们总是使用C ++。内联汇编是否是C标准(ANSII或ISO)的一部分?

3 个答案:

答案 0 :(得分:17)

它不符合ISO C标准(C2011的n1570草案),但在附录J(常见扩展名)中提及:

  

J.5.10 asm关键字

     

1 asm关键字可用于将汇编语言直接插入转换器输出(6.8)。最常见的实现是通过以下形式的声明:

asm ( character-string-literal );

附件J是信息性的,而不是规范性的,因此实施不需要提供内联汇编,如果没有,则不以哪种形式规定。但它是一种普遍的扩展,虽然不可移植,因为编译器确实以不同的方式实现它。

在C ++标准(C ++ 11标准的n3376草案)中,它在标准正文中提到

  

7.4 asm声明 [dcl.asm]

     

1 asm声明的格式为

     

ASM-定义:

asm ( string-literal ) ;
     

asm声明是有条件支持的;它的含义是实现定义的。 [注意:通常   它用于通过实现将信息传递给汇编程序。 - 结束说明]

但也不是强制性的,并且具有实现定义的解释。

答案 1 :(得分:4)

与普遍看法相反,{C}标准中asm ,但对它的支持是有条件的。 §7.4/ 1:

  

asm声明的格式为

     

ASM-定义

asm ( string-literal ) ;
     

asm声明是有条件支持的;其含义是实施 -       定义

也就是说,“有条件支持”意味着你根本不能依赖支持这一点的特定编译器。 Microsoft(对于一个明显的示例)使用_asm关键字,但语法完全不同(汇编语言用括号括起来而不是字符串文字)。

答案 2 :(得分:1)

否 - 内联asm是一种常见的扩展,但非标准(并且通常由不同供应商实现不同)。