名稱空間
變體
操作

asm 宣告

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
 
 

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

與其他塊宣告一樣,此宣告可以出現在塊(函式體或其他複合語句)內部,並且,與所有其他宣告一樣,此宣告也可以出現在塊外部。

[編輯] 註釋

功能測試宏 標準 特性
__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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
CWG 195 C++98 要求支援所有 asm 宣告 改為條件支援
CWG 2262 C++11 屬性不能應用於 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 文件,關於 內聯彙編

[編輯] 外部連結

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 呼叫約定 — 維基百科