在 Linux 系統編程中,將高性能的匯編代碼與靈活的 C 代碼結合是常見優化手段。本文系統梳理兩種互調方式、參數傳遞約定、符號聲明規則,並給出 32 位實戰鏈接與常見 AT&T 語法錯誤解決方案。
__asm__),適合極短片段、寄存器級優化。%ebp 相對偏移訪問參數。此為 cdecl 約定核心。.global func_name 導出符號,供 C 鏈接器解析。extern 返回類型 func_name(參數列表); 聲明外部函數。參考經典教程 Linux 匯編與 C 互相調用(32 位),關鍵步驟:
# asm_func.s
.global asm_add
asm_add:
movl 4(%esp), %eax # 取第一個參數
addl 8(%esp), %eax # 加第二個參數
ret
// main.c
extern int asm_add(int a, int b);
int main() { return asm_add(3, 5); }
編譯鏈接:gcc -m32 -c asm_func.s -o asm_func.o && gcc -m32 main.c asm_func.o -o app
push 指令後綴錯誤錯誤提示 Error: invalid instruction suffix for `push' 原因是 AT&T 語法要求操作數長度後綴(b/w/l/q)。pushl %eax 正確,push %eax 錯誤。詳細修正參考 Linux AT&T 匯編錯誤解決。
objdump -d 檢查生成機器碼,驗證參數傳遞正確性。