內聯彙編
來自 cppreference.com
內聯彙編(通常由 asm 關鍵字引入)提供了在 C 程式中嵌入組合語言原始碼的能力。
與 C++ 不同,在 C 語言中,內聯彙編被視為一種擴充套件。它是有條件支援且由實現定義的,這意味著它可能不存在,即使由實現提供,它也沒有固定的含義。
目錄 |
[編輯] 語法
asm ( string_literal ) ; |
|||||||||
本節不完整 原因:撰寫一篇關於 GCC 擴充套件彙編語法的註釋,因為它現在已被 Intel、IBM、Sun(從 v12 開始)等支援。 |
[編輯] 解釋
這種內聯彙編語法被 C++ 標準接受,在 C++ 中稱為 asm-declaration。string_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 內聯彙編 |