Franklin C51 針對 Intel 8051 系列單晶片,提供豐富庫函數與自動記憶體管理,適合寫主程式。但特定場合需呼叫 A51 組語:既有組語庫重用、極致時序控制、高速 ISR、特殊介面協定。反之,組語主程式需 C51 強大數學庫(浮點、三角函數)時也需反向呼叫。本文系統說明雙向介面技術。
| C 定義 | 目標檔符號 | 備註 |
|---|---|---|
func() | _func | 含暫存器參數傳遞 |
#pragma NOREGPARMS + func() | func | 無前綴底線 |
static func() | 不公開 | 僅模組內可見 |
組語需用 EXTRN CODE (_func) 或 EXTRN CODE (func) 對應宣告。
?PR?函數名?模組名(如 ?PR?FUNC?FUNC51)。?函數名?BYTE, ?函數名?BIT,具 OVERLAYABLE 屬性供連結器覆蓋分析。預設使用暫存器傳遞前 3 參數,效率最高。#pragma NOREGPARMS 強制全走記憶體區段。
| 參數型別/個數 | 暫存器分配 (R7:R6 為第一參數...) |
|---|---|
char / 8-bit | R7 |
int / 16-bit | R7:R6 |
long / 32-bit | R7:R6:R5:R4 |
| 指標 (SMALL) | R1:R0 (DPL:DPH) |
| 指標 (LARGE) | R3:R2:R1:R0 |
| 型別 | 暫存器 |
|---|---|
char | R7 |
int | R7:R6 |
long | R7:R6:R5:R4 |
| 指標 | R3:R2:R1:R0 (視模式) |
編譯選項 SRC 產生對應組語檔,可直接檢視參數/返回值分配:
; C: uchar func(uchar x, uchar y)
_func:
MOV A, R7 ; x 在 R7
MOV B, R5 ; y 在 R5
DIV AB
MOV R7, A ; 返回值在 R7
RET
C51 (func51.c):#pragma NOREGPARMS + SMALL 模式,uchar func(uint v_a, uint v_b) 回傳 sqrt(v_a/v_b)。
A51 (ASM51.a51):
EXTRN CODE (func)
EXTRN DATA (?func?BYTE)
funca51 SEGMENT CODE
VAR SEGMENT DATA
STACK SEGMENT IDATA
RSEG VAR
a_v: DS 2
b_v: DS 2
result: DS 1
RSEG STACK
DS 20H
RSEG funca51
JMP START
START:
MOV SP, #STACK-1
MOV ?func?BYTE+0, a_v+0
MOV ?func?BYTE+1, a_v+1
MOV ?func?BYTE+2, b_v+0
MOV ?func?BYTE+3, b_v+1
LCALL func
MOV result, R7
END
連結:L51 ASM51.OBJ, func51.OBJ NOOVERLAY(禁止資料段覆蓋確保參數區不被重用)。
C51 主程式:宣告 extern 四個組語函數,主流程處理溫度轉換公式與 LCD 顯示。
A51 (RW1820.a51) 四子程式:
_WDS1820:寫 1 位元組命令(R7 傳參),含精確 15μs 延時。_RDS1820:讀 9 位元組資料(R7 傳陣列指標),位搬移邏輯。_RTDS1820:復位檢測存在脈衝,返回 C 旗標(bit 返回值)。_DELAY15:R7 傳入倍數,雙層 DJNZ 實現 15μs 基準延時。關鍵點:
?PR?函數名?RW1820。PUBLIC _RTDS1820, _WDS1820, _RDS1820, _DELAY15 匯出符號(底線對應 C51 預設慣例)。extern bit RTDS1820(void) 接收。NOP 微調,12MHz 下精確符合 DS1820 規格。SRC 輸出核對每個參數實際位置。_WDS1820 用 R1, R2, R7)若與 C51 暫存器分配衝突,需在組語入口保存/恢復或改用 NOREGPARMS。NOOVERLAY 避免參數區被錯誤覆蓋;大專案建議模組化管理覆蓋關係。掌握 C51/A51 混合編程,能在 8051 資源受限環境下發揮 C 的開發效率與組語的極致控制雙重優勢。