asm
声明
来自 cppreference.com
asm-declaration 允许在 C++ 程序中嵌入汇编语言源代码。此声明是 条件支持的,并且 (自 C++11 起)实现定义的,这意味着 它可能不存在,即使实现提供了它, (自 C++11 起)它也没有固定的含义。
内容 |
[编辑] 语法
attr (可选) asm ( 字符串字面量 ) ; |
(直到 C++26) | ||||||||
attr (可选) asm ( 平衡令牌序列 ) ; |
(自 C++26 起) | ||||||||
attr | - | (自 C++11 起) 任意数量的 属性 |
字符串字面量 | - | 与 字符串字面量 相同,包括原始字符串字面量 |
平衡令牌序列 | - | 一系列令牌,其中括号、方括号和大括号是平衡的;对 平衡令牌序列 及其含义的任何限制都是实现定义的 |
[编辑] 解释
平衡令牌序列 通常是一个字符串字面量,它表示用汇编语言编写的简短程序,每当执行此声明时就会执行此程序。不同的 C++ 编译器对 asm-declarations 有不同的规则,以及对与周围 C++ 代码交互的不同约定。
与其他 块声明 一样,此声明可以出现在块(函数体或其他复合语句)内部,并且与所有其他声明一样,此声明也可以出现在块外部。
本节不完整 原因:写一个关于 GCC 扩展汇编语法的说明,因为它现在受 Intel、IBM、Sun(从 v12 开始)等支持 |
[编辑] 备注
功能测试宏 | 值 | Std | 功能 |
---|---|---|---|
__cpp_constexpr |
201907L | (C++20) | constexpr 函数中的简单 默认初始化 和 asm-declaration |
[编辑] 关键字
[编辑] 示例
演示了 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]
- 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 内联汇编 — Locklessinc.com |
3. | IBM XL C/C++ 内联汇编 |
4. | Intel C++ 内联汇编 |
5. | Visual Studio 内联汇编程序 |
6. | Sun Studio 12 Asm 语句 |
7. | 基于 Itanium 的 HP-UX 的内联汇编 |
8. | X86 调用约定 — 维基百科 |