1. C 語言中內嵌匯編語法
GCC (Linux/嵌入式) - AT&T 語法
// 基本格式
asm("指令模板" : 輸出操作數 : 輸入操作數 : 掛礀寄存器);
// 例:x = a + b
int a=1, b=2, x;
asm("addl %%ebx, %%eax" : "=a"(x) : "a"(a), "b"(b)); // x = a+b
MSVC (Windows) - Intel 語法
__asm {
mov eax, a
add eax, b
mov x, eax
}
// 或內聯 __asm 指令
2. C 與匯編變量共享
- 全局/靜態變量:C 中定義
int g_var;,匯編中直接用標號 g_var 訪問(需 extern 聲明或同一編譯單元)。
- 局部變量:棧上分配,匯編難以直接按名訪問。推薦:通過寄存器/棧傳參,或取地址傳給匯編函數。
- 結構體:匯編中按偏移量訪問成員,需確保編譯器對齊規則一致(
#pragma pack)。
3. 函數相互調用
| 方向 | 調用約定關鍵點 |
| C 調用匯編函數 | 匯編函數遵循平台 ABI (cdecl/System V AMD64/ARM AAPCS):參數入棧/寄存器、返回值在 EAX/RAX/X0、保護被調用者保存寄存器 |
| 匯編調用 C 函數 | 按 ABI 準備參數,call c_func,調用後清理棧 (cdecl),保護調用者保存寄存器 |
4. 實戰建議
- 優先用 C 內建函數:GCC
__builtin_*、MSVC _interlocked*、SIMD 內建,避免手寫匯編。
- 隔離匯編:將匯編代碼放在獨立
.s/.asm 文件,通過函數接口調用,便於維護與跨平台。
- 驗證輸出:編譯生成彙編清單 (
-S / /Fa) 檢查編譯器生成的代碼是否符合預期。