首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言內嵌匯編開發指南:GCC/MSVC語法、混合編程與變量共享

     編輯:C 語言問答

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) 檢查編譯器生成的代碼是否符合預期。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved