命名空间
变体
操作

asm 声明

来自 cppreference.com
< cpp‎ | 语言
 
 
C++ 语言
表达式
替代表示
字面量
布尔值 - 整数 - 浮点数
字符 - 字符串 - nullptr (C++11)
用户定义 (C++11)
实用工具
属性 (C++11)
类型
typedef 声明
类型别名声明 (C++11)
强制转换
内存分配
特定于类的函数属性
explicit (C++11)
static

特殊成员函数
模板
杂项
内联汇编
 
 

asm-declaration 允许在 C++ 程序中嵌入汇编语言源代码。此声明是 条件支持的,并且 (自 C++11 起)实现定义的,这意味着 它可能不存在,即使实现提供了它, (自 C++11 起)它也没有固定的含义。

内容

[编辑] 语法

attr (可选) asm ( 字符串字面量 ) ; (直到 C++26)
attr (可选) asm ( 平衡令牌序列 ) ; (自 C++26 起)
attr - (自 C++11 起) 任意数量的 属性
字符串字面量 - 字符串字面量 相同,包括原始字符串字面量
平衡令牌序列 - 一系列令牌,其中括号、方括号和大括号是平衡的;对 平衡令牌序列 及其含义的任何限制都是实现定义的

[编辑] 解释

平衡令牌序列 通常是一个字符串字面量,它表示用汇编语言编写的简短程序,每当执行此声明时就会执行此程序。不同的 C++ 编译器对 asm-declarations 有不同的规则,以及对与周围 C++ 代码交互的不同约定。

与其他 块声明 一样,此声明可以出现在块(函数体或其他复合语句)内部,并且与所有其他声明一样,此声明也可以出现在块外部。

[编辑] 备注

功能测试宏 Std 功能
__cpp_constexpr 201907L (C++20) constexpr 函数中的简单 默认初始化asm-declaration

[编辑] 关键字

asm

[编辑] 示例

演示了 GCC/Clang 编译器提供的两种内联汇编语法。此程序仅在 Linux 下的 x86_64 平台上正常工作。

#include <iostream>
 
extern "C" int func(int x);
// the definition of func is written in assembly language
// raw string literal could be very useful
asm(R"(
.globl func
    .type func, @function
    func:
    .cfi_startproc
    movl %edi, %eax /* x is in RDI, see x86-64 calling convention */
    addl $1, %eax
    ret
    .cfi_endproc
)");
 
int main()
{
    int n = func(0110);
    // formerly non-standard inline assembly, made comforming by P2361R6
    asm ("leal (%0,%0,4),%0"
         : "=r" (n)
         : "0" (n));
    std::cout << "73*5 = " << n << std::endl; // flush is intentional
 
    // standard inline assembly
    asm ("movq $60, %rax\n" // the exit syscall number on Linux
         "movq $2,  %rdi\n" // this program returns 2
         "syscall");
}

输出

73*5 = 365

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
CWG 195 C++98 需要支持所有 asm 声明 条件支持
CWG 2262 C++11 属性不能应用于 asm 声明 允许

[编辑] 参考

  • C++26 标准 (ISO/IEC 14882:2026)
  • 9.10 asm 声明 [dcl.asm]
  • C++23 标准 (ISO/IEC 14882:2024)
  • 9.10 asm 声明 [dcl.asm]
  • C++20 标准 (ISO/IEC 14882:2020)
  • 9.10 asm 声明 [dcl.asm]
  • C++17 标准 (ISO/IEC 14882:2017)
  • 10.4 asm 声明 [dcl.asm]
  • C++14 标准 (ISO/IEC 14882:2014)
  • 7.4 asm 声明 [dcl.asm]
  • C++11 标准 (ISO/IEC 14882:2011)
  • 7.4 asm 声明 [dcl.asm]
  • C++03 标准 (ISO/IEC 14882:2003)
  • 7.4 asm 声明 [dcl.asm]
  • C++98 标准 (ISO/IEC 14882:1998)
  • 7.4 asm 声明 [dcl.asm]

[编辑] 另请参见

C 文档 关于 内联汇编

[编辑] 外部链接

1.  GCC 内联汇编 HOWTO
2.  GCC 内联汇编 — Locklessinc.com
3.  IBM XL C/C++ 内联汇编
4.  Intel C++ 内联汇编
5.  Visual Studio 内联汇编程序
6.  Sun Studio 12 Asm 语句
7.  基于 Itanium 的 HP-UX 的内联汇编
8.  X86 调用约定 — 维基百科