为什么用 gcc 编写内联汇编有两种方法?
asm volatile(...);
__asm__ __volatile__(...);
我看到两者都被使用;为什么要创建一些重复的东西?
asm volatile(...);
__asm__ __volatile__(...);
I see both are used; why create some duplicate stuff?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
C 标准保留“asm”供用户出于任何目的使用。因此,GCC 提供了 __asm__ 表示法来避免进入用户的名称空间(因为以双下划线开头的标识符是为实现保留的)。
双下划线的表示法很笨拙,因此 GCC 提供了没有双下划线的更令人愉快的界面。但如果您打开符合标准的编译模式(例如
-std=c99
),则asm
选项将被关闭。通过使用双下划线符号书写,它始终可用。因此,
asm
读起来更愉快,但__asm__
符合 C 标准。The C standard reserves 'asm' for use by users for any purpose. Therefore, GCC provides the
__asm__
notation to avoid running into the user's name space (because identifiers starting with double underscore are reserved for the implementation).The notation with the double underscore is ungainly, so GCC provides the pleasanter interface without the double underscores. But if you turn on a standard-compliant compilation mode (such as
-std=c99
), theasm
option is turned off. By writing with the double underscore notation, it is always available.So,
asm
is pleasanter to read, but__asm__
is compliant with the C standard.来自 GCC 内联汇编 HOWTO “您可能有注意到这里我使用了
asm
和__asm__
,如果关键字是有效的,我们可以使用__asm__
。asm
与我们程序中的某些内容发生冲突。”From GCC Inline Assembly HOWTO "You might have noticed that here I’ve used
asm
and__asm__
. Both are valid. We can use__asm__
if the keywordasm
conflicts with something in our program."