C 與組合語言混合編程的核心挑戰在於符號命名規範、參數傳遞慣例與記憶體定址模式的協調。本文系統整理三大互呼場景、定址模式切換要點與內嵌組語注意事項,為嵌入式與系統級開發提供快速參考。
C 編譯器處理全域符號時,會在前方加上底線 _:
extern int num → 組語符號 _num(位於 .bss 段)extern float nums[5] → _numsextern void func() → _func組語中引用 C 符號直接加底線;C 中引用組語符號,組語端需 global _var 並以下底線命名。
mov ax, [_num];陣列元素 mov ax, [_nums + 3*TYPE]。call _funcname。extern 宣告。_ 開頭 + global 宣告全域可見。_ 開頭,且必須符合 C 編譯模式的參數取用慣例(Stack-based vs Register-argument)。asm("instruction");
C 語言區域變數採 SP 相對定址(Stack-based);組語為精簡指令碼常用 DP 直接定址(低 7 位在指令碼中,高 9 位由 DP 提供)。
混合編程時,為避免組語指令破壞 SP 導致 C 區域變數定址錯誤,組語模組應強制使用 DP 定址模式:
此策略讓兩套定址體系互不干擾,是混合專案穩定運行的基石。