摘要:通過了解Turbo C和彙編相容使用IBM PC系列機存貯系統的方法,遵循Turbo C調用彙編的各項約定, 可将彙編語言程式當作C語言的一個過程來處理, 并通過執行個體闡釋如何實作Turbo C對彙編語言程式的調用。
關鍵詞:Turbo C;彙編;過程調用;執行個體闡釋
中圖分類号:TP312.TC 文獻辨別碼:A 文章編号:1007-9599 (2012) 11-0000-02
一、引言
C語言具有功能強大,友善應用,移植性高的特點,在進階程式設計語言方面的應用較為廣泛,其缺陷表現在通路計算機系統硬體資源接口位址讀寫等方面明顯不足。彙編語言程式設計工作量大,并且開發周期特别長,極為容易出錯,且較難調試,但其優點為代碼短,占記憶體小,裝載速度快,可以直接控制硬體資源,綜上所述楊二者之長,避二者之短,将二者混合程式設計,不失為一種高效程式設計開發方法。
二、Turbo C和彙編相容使用IBM PC系列機存貯系統的方法
将C程式與彙編語言程式兩種語言的代碼和資料分别連在一起,組成一個可執行檔案,必須進行段的組合。連接配接程式根據名字來識别代碼和資料段,并決定它們之間的組合關系。
(一)彙編語言的段群組
彙編語言中段的格式如下??
段名 SEGMENT〔對齊類型〕〔組合類型〕〔‘類别’〕??
段名 ENDS?? ?? ?? ??
其中段名指源程式和資料段的名字,組合類型指對名字相同的各段的處理辦法,類别是給同一類源碼代碼或資料取的名字,屬同一類别的各段在記憶體連續存放。另外,還可使用僞指令DGROUP進行組合。
(二)Turbo C的段群組
以小型模式為例,C程式編譯後的目标程式按下列方式存放,生成的代碼段段名為_TEXT,類别為‘CODE’;生成的已初始化全局變量段段名為_DATA,類别為‘DATA’;生成的未初始化全局變量段段名為_BSS,類别為‘BSS’;生成的堆棧段段名為STACK,類别為‘STACK’;_DATA, _BSS, STACK合成一個組,組名為GROUP。
(三)段群組的連接配接
在編寫彙編語言程式時按照C語言的有關規定來編制程式。以下是彙編語言程式格式:?? SEGMENT BYTE PUBLIC ‘CODE’
ASSUME CS: ,DS:
ENDS
GROUP _DATA, _BSS
SEGMENT WORD PUBLIC ‘DATA’
ENDS
_BSS SEGMENT WORD PUBLIC ‘BSS’
_BSS ENDS
END
?? ,,代表代碼段名, 全局變量段名, 數組名。若按照Turbo C的預設規定,這些名字應進行如下替換:
=_TEXT
=_DATA
=DGROUP
這樣使編制的彙編語言程式和C程式編譯後的.ASM檔案格式上完全相容, 達到調用的目的。
三、Turbo C過程調用彙編的各項約定
(一)存儲模式約定
在混編過程中,彙編語言要和C語言的存儲模式相同。在彙編語言中使用僞指令.Model***,表示在彙編語言中采用的存儲模式,其中***表示上述6種模式中的一種。若C采用小模式,則在彙編語言中要使用。
(二)命名約定
C語言源程式可直接使用外部過程名調用外部過程,但在編譯源程式時,為了更好地與C程式連接配接,編譯系統自動在變量名與過程名前加一個下劃線。
C語言的過程名與變量名均采用小寫字母,而彙編語言則不區分大小寫,為此,有效的辦法是關閉在連接配接時将LINK程式中的大小寫開關,使其能互相預設。
(三)調用約定
Turbo C調用外部過程時,均采用标準的extern關鍵字予以說明。當C語言調用彙編語言程式定義的變量和函數時,在C語言一側應該用extern進行說明,其格式如下:
函數:extern 傳回值類型名稱(參數類型表)
變量:extern 類型變量名
而在彙編語言一側, 必須用public。加以說明:
public _函數名
public _變量名
(四)參數傳遞約定
1.擷取調用者的入口參數
C語言函數通過堆棧向彙編語言函數傳遞參數。調用彙編語言函數之前,Turbo C 先将要傳給彙編語言函數的參數壓入堆棧,最先壓入最右邊的參數,最後壓入最左邊的參數,如圖1所示。
2.傳回值的傳遞
當從彙編語言程式傳回主調程式時,其傳回值按以下方法傳遞給主調程式:如傳回值小于或等于16位,則存放在AX中;如果傳回值是32位,則存放在AX/DX 兩個寄存器中,DX存高16位,AX存放低16位;如果是32位指針,則DX中存放段位址,AX中存放偏移量;如果傳回值大于32位,則存放在靜态變量存貯區,指向這個存貯區的指針放在AX内。
3.保護寄存器
Turbo C要求供它調用的彙編語言函數必須保護好寄存器BP、SP、CS、DS 和SS 的内容。盡管在彙編語言函數中可以改變這些寄存器的内容,但當傳回時,它們的值必須與調用前相同。可以随意改變寄存器AX、BX、CX、DX和ES 及标志寄存器的内容。
寄存器SI和DI是特殊情況,因為Turbo C 将其用作寄存器變量。如果在調用彙編語言函數的C子產品中啟動了寄存器變量,那麼在彙編語言函數就必須保護寄存器SI和DI;但若沒有啟動寄存器變量,就不必保護這兩個寄存器。保護寄存器SI和DI,應該像保護寄存器BP那樣。