asm
宣告
來自 cppreference.com
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 呼叫約定 — 維基百科 |