asm 声明

来自cppreference.com
< cpp‎ | language


 
 
C++ 语言
 
 

汇编(asm)声明 给予在 C++ 程序中嵌入汇编语言源代码的能力。此声明受条件性支持且 (C++11 起)由实现定义,意思是它可以不存在,而且即使实现有所提供,它也 (C++11 起)并不拥有固定的含义。

语法

属性 (可选) asm ( 字符串字面量 ) ; (C++26 前)
属性 (可选) asm ( 平衡记号序列 ) ; (C++26 起)
属性 - (C++11 起) 任意数量的属性
字符串字面量 - 字符串字面量相同,包括原始字符串字面量
平衡记号序列 - 记号的序列,其中圆括号、方括号和花括号平衡出现;平衡记号序列上的任何约束和其含义均由实现定义

解释

平衡记号序列 通常是以汇编语言编写的短程序,该程序会在执行这条声明时执行。不同的 C++ 编译器的汇编声明规则有巨大差异,和与周围的 C++ 代码之间交互的约定也不同。

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

注解

功能特性测试宏 标准 功能特性
__cpp_constexpr 201907L (C++20) constexpr 函数中的平凡默认初始化汇编声明

关键词

asm

示例

这里演示 GCC/Clang 等编译器提供的两种内联汇编语法。此程序只在 x86-64 上的 Linux 下正确工作。

#include <iostream>
 
extern "C" int func(int x);
// func 的定义以汇编语言书写
// 原始字符串字面量可以很有用
asm(R"(
.globl func
    .type func, @function
    func:
    .cfi_startproc
    movl %edi, %eax /* x 在 RDI 中,见 x86-64 调用约定 */
    addl $1, %eax
    ret
    .cfi_endproc
)");
 
int main()
{
    int n = func(0110);
    // 之前是非标准的内联汇编,但被 P2361R6 认可
    asm ("leal (%0,%0,4),%0"
         : "=r" (n)
         : "0" (n));
    std::cout << "73*5 = " << n << std::endl; // 冲洗缓冲区是有意的
 
    // 标准内联汇编
    asm ("movq $60, %rax\n" // Linux 上的“退出”的系统调用序号
         "movq $2,  %rdi\n" // 此程序返回 2
         "syscall");
}

输出:

73*5 = 365

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
CWG 195 C++98 需要支持所有的 asm 声明 只需要条件性支持
CWG 2262 C++11 不能将属性应用到 asm 声明 可以应用

引用

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

参阅

外部链接

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