8

我一直认为是这样,但许多 IDE 和语法高亮工具不会在 C 中高亮 ASM,但它们总是使用 C++。内联汇编是否是 C 标准(ANSII 或 ISO)的一部分?

4

3 回答 3

18

它不在 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 声明是有条件支持的;它的含义是实现定义的。[注意:通常它用于通过实现将信息传递给汇编器。——尾注]

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

于 2012-12-13T23:42:33.153 回答
4

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

asm 声明的形式为

asm 定义

asm ( string-literal ) ;

asm 声明是有条件支持的;它的含义是实现定义的。

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

于 2012-12-14T00:01:52.250 回答
2

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

于 2012-12-13T23:41:25.593 回答