名稱空間
變體
操作

內聯彙編

來自 cppreference.com
< c‎ | 語言

內聯彙編(通常由 asm 關鍵字引入)提供了在 C 程式中嵌入組合語言原始碼的能力。

與 C++ 不同,在 C 語言中,內聯彙編被視為一種擴充套件。它是有條件支援且由實現定義的,這意味著它可能不存在,即使由實現提供,它也沒有固定的含義。

目錄

[編輯] 語法

asm ( string_literal ) ;

[編輯] 解釋

這種內聯彙編語法被 C++ 標準接受,在 C++ 中稱為 asm-declarationstring_literal 通常是一段用匯編語言編寫的短程式,每當執行此宣告時,它就會被執行。不同的 C 編譯器對 asm-declaration 的規則差異很大,並且與周圍 C 程式碼的互動約定也不同。

asm-declaration 可以出現在程式碼塊內部(函式體或另一個複合語句),並且與其他所有宣告一樣,它也可以出現在程式碼塊外部。

[編輯] 注意事項

MSVC 不支援 ARM 和 x64 處理器上的內聯彙編,並且僅支援 x86 處理器上由 __asm 引入的形式。

當 GCC 或 Clang 以 ISO C 模式編譯時(例如使用選項 -std=c11),必須使用 __asm__ 而不是 asm

[編輯] 示例

演示了 GCC 編譯器提供的兩種內聯彙編語法。此程式僅在 Linux 下的 x86-64 平臺上正常工作。請注意,“標準內聯彙編”在 C 標準中也被視為擴充套件。

#include <stdio.h>
 
extern int func(void);
// the definition of func is written in assembly language
__asm__(".globl func\n\t"
        ".type func, @function\n\t"
        "func:\n\t"
        ".cfi_startproc\n\t"
        "movl $7, %eax\n\t"
        "ret\n\t"
        ".cfi_endproc");
 
int main(void)
{
    int n = func();
    // gcc's extended inline assembly
    __asm__ ("leal (%0,%0,4),%0"
           : "=r" (n)
           : "0" (n));
    printf("7*5 = %d\n", n);
    fflush(stdout); // flush is intentional
 
    // standard inline assembly in C++
    __asm__ ("movq $60, %rax\n\t" // the exit syscall number on Linux
             "movq $2,  %rdi\n\t" // this program returns 2
             "syscall");
}

輸出

7*5 = 35

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • J.5.10 asm 關鍵字 (p: 待定)
  • C17 標準 (ISO/IEC 9899:2018)
  • J.5.10 asm 關鍵字 (p: 422)
  • C11 標準 (ISO/IEC 9899:2011)
  • J.5.10 asm 關鍵字 (p: 580)
  • C99 標準 (ISO/IEC 9899:1999)
  • J.5.10 asm 關鍵字 (p: 512)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • G.5.10 asm 關鍵字

[編輯] 另請參閱

C++ 文件 關於 asm 宣告

[編輯] 外部連結

1.  GCC 內聯彙編 HOWTO
2.  IBM XL C/C++ 內聯彙編
3.  Intel C++ 內聯彙編
4.  Visual Studio 內聯彙編器
5.  Sun Studio 12 Asm 語句
6.  基於 Itanium 的 HP-UX 內聯彙編