命名空间
变体
操作

asm 声明

来自 cppreference.cn
< cpp‎ | language
 
 
C++ 语言
通用主题
流程控制
条件执行语句
if
迭代语句 (循环)
for
范围 for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (在 C++11 中弃用*)
noexcept 说明符 (C++11)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储期说明符
初始化
 
 

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

内容

[编辑] 语法

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

[编辑] 解释

balanced-token-seq 通常是表示用汇编语言编写的短程序的字符串字面量,每当执行此声明时,该程序就会被执行。不同的 C++ 编译器对于 asm 声明有非常不同的规则,以及与周围 C++ 代码交互的不同约定。

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

[编辑] 注意

特性测试宏 Std 特性
__cpp_constexpr 201907L (C++20) constexpr 函数中的平凡默认初始化asm 声明

[编辑] 关键字

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 内联 ASM — Locklessinc.com
3.  IBM XL C/C++ 内联汇编
4.  Intel C++ 内联汇编
5.  Visual Studio 内联汇编器
6.  Sun Studio 12 Asm 语句
7.  用于基于 Itanium 的 HP-UX 的内联汇编
8.  X86 调用约定 — Wikipedia