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

Is inline asm part of the ANSI C standard?

本文关键字:一部分 标准 asm ANSI 内联      更新时间:2023-10-16

我一直认为是这样,但许多IDE和语法突出显示工具并不突出显示C中的ASM,但它们总是使用C++。内联装配是否是C标准(ANSII或ISO)的一部分?

它不在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声明;其含义是实现定义的。[注:通常它用于通过实现将信息传递给汇编程序尾注]

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

与流行的观点相反,asm在C++标准中是,但对它的支持是有条件的。§7.4/1:

asm声明的形式为

asm定义:

asm ( string-literal ) ;

有条件地支持asm声明;它的意义在于实现-定义

也就是说,"有条件支持"意味着你根本不能依赖于支持它的特定编译器。微软(举一个明显的例子)使用了_asm关键字,但语法完全不同(汇编语言用大括号括起来,而不是字符串文字)。

无内联asm是一个常见的扩展,但不是标准的(不同的供应商通常会以不同的方式实现)。