asm 宣告
出自 cppreference.com
asm-宣告 (asm-declaration) 提供了在 C++ 程式中嵌入組合語言原始碼的能力。此宣告是條件支援且(自 C++11 起)由實作定義 (implementation defined),這意味著它可能不存在,且即使由實作提供,(自 C++11 起)它也沒有固定的含義。
目錄 |
[編輯] 語法
attr (可選) asm ( 字串實字 (string-literal) ) ; |
(直到 C++26) | ||||||||
attr (可選) asm ( 平衡權杖序列 (balanced-token-seq) ) ; |
(C++26 起) | ||||||||
| 屬性 | - | (C++11 起) 任意數量的 屬性 (attributes) |
| 字串字面值 | - | 與 字串實字 中的定義相同,包含原始字串實字 (raw string literals) |
| 平衡權杖序列 (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++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| CWG 195 | C++98 | 要求必須支援所有的 asm 宣告 | 改為條件支援 |
| CWG 2262 | C++11 | 屬性 (attributes) 無法應用於 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 語言文件 關於 內聯組譯 (Inline assembly)
|
[編輯] 外部連結
| 1. | GCC Inline Assembly HOWTO |
| 2. | GCC Inline 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 呼叫慣例 — 維基百科 |