命名空间
变体
操作

asm 声明

来自 cppreference.cn
< cpp‎ | 语言
 
 
C++ 语言
 
 

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

目录

[编辑] 语法

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

[编辑] 解释

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

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

[编辑] 注释

功能测试宏 标准 特性
__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++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
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 调用约定 — 维基百科