asm
声明
来自 cppreference.cn
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++ 代码的交互也有不同的约定。
与其他块声明一样,此声明可以出现在块(函数体或其他复合语句)内部,并且,与所有其他声明一样,此声明也可以出现在块外部。
本节不完整 理由:编写关于 GCC 扩展汇编语法的注释,因为它现在受到 Intel、IBM、Sun(v12 起)等的支持 |
[编辑] 注释
功能测试宏 | 值 | 标准 | 特性 |
---|---|---|---|
__cpp_constexpr |
201907L |
(C++20) | constexpr 函数中的简单默认初始化和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]
- 9.10
- C++23 标准 (ISO/IEC 14882:2024)
- 9.10
asm
声明 [dcl.asm]
- 9.10
- C++20 标准 (ISO/IEC 14882:2020)
- 9.10
asm
声明 [dcl.asm]
- 9.10
- C++17 标准 (ISO/IEC 14882:2017)
- 10.4
asm
声明 [dcl.asm]
- 10.4
- C++14 标准 (ISO/IEC 14882:2014)
- 7.4
asm
声明 [dcl.asm]
- 7.4
- C++11 标准 (ISO/IEC 14882:2011)
- 7.4
asm
声明 [dcl.asm]
- 7.4
- C++03 标准 (ISO/IEC 14882:2003)
- 7.4
asm
声明 [dcl.asm]
- 7.4
- C++98 标准 (ISO/IEC 14882:1998)
- 7.4
asm
声明 [dcl.asm]
- 7.4
[编辑] 另请参阅
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 调用约定 — 维基百科 |