命名空間
變體
動作

asm 宣告

出自 cppreference.com
< cpp‎ | language
 
 
C++ 語言
一般主題
流程控制
條件執行陳述式
if
疊代陳述式 (迴圈)
for
範圍 for (C++11)
跳躍陳述式
函式
函式宣告
Lambda 函式運算式
inline 指定符
動態例外規範 (直到 C++17*)
noexcept 指定符 (C++11)
例外
命名空間
型別
指定符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期指定符
初始化
 
 

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++ 程式碼互動的不同約定。

與其他 區塊宣告 一樣,此宣告可以出現在區塊內(函式主體或其他複合敘述中),且如同所有其他宣告,此宣告也可以出現在區塊之外。

[編輯] 附註

特性測試巨集 數值 標準 功能
__cpp_constexpr 201907L (C++20) constexpr 函式中的簡單 預設初始化asm-宣告

[編輯] 關鍵字

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]
  • C++23 標準 (ISO/IEC 14882:2024)
  • 9.10 asm 宣告 [dcl.asm]
  • C++20 標準 (ISO/IEC 14882:2020)
  • 9.10 asm 宣告 [dcl.asm]
  • C++17 標準 (ISO/IEC 14882:2017)
  • 10.4 asm 宣告 [dcl.asm]
  • C++14 標準 (ISO/IEC 14882:2014)
  • 7.4 asm 宣告 [dcl.asm]
  • C++11 標準 (ISO/IEC 14882:2011)
  • 7.4 asm 宣告 [dcl.asm]
  • C++03 標準 (ISO/IEC 14882:2003)
  • 7.4 asm 宣告 [dcl.asm]
  • C++98 標準 (ISO/IEC 14882:1998)
  • 7.4 asm 宣告 [dcl.asm]

[編輯] 參見

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 呼叫慣例 — 維基百科
English Deutsch 日本語 한국어 中文(简体) 中文(繁體)