蔣仁祥
(福建師范大學數學和計算機學院,福建 福州 350007)
淺談匯編語言與C語言的混合程序設計技術
蔣仁祥
(福建師范大學數學和計算機學院,福建 福州 350007)
匯編語言實際上就是一種針對機器的語言形式,具有極快的運行速度和較小的存儲空間,可在一定條件下直接控制硬件,在多種領域中均得到廣泛的應用,并具有至關重要的作用。然而在實際的編寫與調試環節中,其難度和復雜程度都是很大的,特別是混合運算環節。C語言具有極高的靈活性和表達能力,在軟件的開發環節,運用匯編語言與C語言的混合程序設計技術,不僅可以有效解決單一使用匯編語言處理數據時的困難,還可大幅提高實際的運行效率。文章闡述了兩種語言混合編程的具體方法,以及二者在連接時應注意的問題,為該混合程序設計技術的推廣與應用奠定基礎。
匯編語言;C語言;混合程序設計
較大程序的設計過程中,若在充分使用匯編語言程序的前提下,充分融合其他高級語言程序,這樣不僅可以全面發揮出各類程序的特點,還能實現二者融合所帶來的優勢,實現現階段主流的混合編程。程序設計過程中,C語言在一定條件下,可完成匯編語言對應子程序的調用,這一過程是可逆的,匯編語言與C語言可相互調用,另外由于C語言具有較高的表達能力,所以在被調用時匯編語言還能將對應的語句融入其中,這是單一程序編程無法達到的,具有很高的實際價值。然而,在混合編程階段,應密切注意匯編語言與 C語言之間的連接情況,對可能造成影響的因素進行綜合分析,確?;旌暇幊贪l揮出最佳的效果。
在實際的編程過程中,將 C語言與匯編語言充分結合的編程方法主要包括四方面內容:
(1)混合編程過程中,指定編程任務會被分成多種功能模塊,通常情況下,模塊主要以程序或者是函數的形態表現,結合模塊的實際特點選取適宜的語言完成編程,隨后運用對應的編譯系統將編程結果按要求轉換為目標文件,最終將所有目標文件進行連接,從而生成完整的文件。
(2)對于C語言程序而言,往往需要運用到在匯編程序中完成定義的常規變量。
(3)一般而言,可將匯編語句直接、快速編入C語言程序中,拓展了C語言程序的功能,有效解決了C語言程序無法控制硬件的缺陷。
(4)通過運用函數的方法,可在C語言內部快速調用匯編語句。
對于 C語言程序而言,可直接完成匯編語言代碼的編寫任務,將指定的匯編語句融入到 C語言程序中時,一般不需要分號,如果所選匯編語句以組的形式存在,則需使用大括號({})。匯編語句包含多種形式,可在C語言中使用的主要分為四類,分別為跳轉、串操作、分配以及一般指令等內容。
為達到調用效果,還需從細節入手,確定匯編語言所對應源程序的段組合是否切實滿足編譯的實際需求,如果源程序違約勢必會對調用效果造成不同程度的影響。
3.1 基本格式
匯編程序子程序格式中的開頭和末尾分別表示程序的開始與結束,均屬偽指令范疇。匯編程序子程序名實際上就是一個標示符,由編程人員自行創建。另外,子程序名通常還表示匯編程序中第一條指令的實際邏輯地址,也可稱作入口地址。一般而言,類型只分兩種,分別為NEAR與FAR,不同類型會對程序中的調用及返回指令對應的翻譯系統造成直接影響。處在程序中心位置的序列為程序段,程序段具備特定的功能,在程序段的末尾,通常會有一條返回指令(RET)。
3.2 子程序的基本格式
與上述基本格式相比子程序主要具備以下幾方面特點:
(1)由于C語言和匯編語言的堆棧段相同,所以,為了達到混合編程的目的,對應的匯編程序在運行的初期必須進行兩條指令,這兩條指令分別為 PUSH BP(緩存?;罚┖蚆OVE BO,SP。
(2)C語言程序的調用對象需在PUBLIC偽操作的支持下進行說明,確定該子程序將要被外部所調用。
(3)C語言支持對應子程序采用DI或SI完成變量的存儲任務,由于在實際情況中,變量一般在兩個時以后進行存放,所以在C語言子程序中會生成PUSH SI/DI語句。
(4)在程序段中,不僅定義了代碼生成器、信息資料管理器還將其合成為整體的數據段(DGROUP),段組內所用的基址是一致的。
(5)程序核心語句中應包含返回函數值,而且該個函數值的具體位置應處在RET語句之前。
(6)調用的返回過程需由RET語句命令。
(7)末尾處的END僅代表程序運行完畢,并為標明實際的啟動位置。
從匯編語言的角度講,其具有的優勢是 C語言難以媲美的,比如在輸入的過程中,匯編語言支持所有進制的數據,并無需翻譯直接讀取。所以在匯編語言中調用 C語言是可以且具有一定價值的。匯編語言中各類程序的格式并沒有太大出入,主程序要求程序的開始階段具有EXTERN語句,以此表名此函數將被調用,屬外部范疇。過程語句中,可在CALL語句的支持下,完成外部函數的調用任務,具體格式為CALL NEAR PTY。如果C語言程序中的子程序具備被調用的條件,則在成為匯編語言程序的子程序時,程序中可以包含 C語言函數,無需添加EXTERN語句進行說明。C語言程序調用過程中軟件的堆棧分配如圖1所示。

圖1 軟件堆棧分配結構示意圖
匯編語言與 C語言連接并混合編程的過程中,需要密切注意三方面內容,分別為參數傳遞、調用關系和模塊連接,只有妥善處理這三方面內容,才能有效提高匯編語言與 C語言的連接及混合編程質量,從而真正提高程序運行效率,改善編程環境。
(1)參數傳遞
匯編語言與 C語言在連接和混合編程的過程中,參數會在一定條件下進行傳遞,一般而言,傳遞過程通常運用堆棧形式。從匯編語言的角度講,主要選取BP作為堆?;返募拇嫫鳎紫葘⒄{用過程中 C語言程序產生的參數進行編排和劃分,并將其壓入至堆棧當中,如果程序在后續的運行過程中需要使用堆棧中的參數時,可再次使用BP 將參數按照實際要求和偏移量實施存取。
(2)調用關系
程序在調用之前,應建立并完善調用關系,以此說明該子程序將被調用。在調用的過程中,對應程序應表明自身已屬外部類型范疇,從而為后續的引用和計算提供便利,同時,調用程序同樣需要及時說明將要被引用程序的具體名稱。在確定調用關系的過程中,還需結合各類存儲模式的具體要求,確定程序的語言格式。C語言程序的小模式一般與匯編語言程序中的近類型相對應,而大模式則與遠類型相對應。
(3)模塊連接
為確保匯編語言與 C語言連接與混合編程的可靠性,還需進一步完善兩方面工作,其一是匯編語言程序與 C語言程序所使用的存儲模式必須為一致的;其二是匯編語言程序需支持 C語言程序的命名要求,在連接和使用之前需擬定兼容合約,由于匯編語言程序的特點較為明顯,所以編程中函數及變量的命名一般以 C語言程序的要求為準,匯編語言程序必須嚴格遵守約定。
C語言程序中主要涵蓋了六種形式的存儲模式,分別為微型存儲模式、小型存儲模式、中型存錯模式、緊湊型存儲模式、大型存儲模式以及巨型存儲模式,由此可見,存儲模式主要由空間和大小區分。其中微型存儲模式中的程序和堆棧均處于相同段內;小型存儲模式具有數據和代碼段,實際數量均為一個。如要進行混合編程,必須確保兩個程序使用相同的存儲模式。對于匯編語言而言,Model代表此程序所用的偽指令,而后需所接內容即為存儲模式,一般為上述模式的其中一種。如果 C語言程序使用了小型存儲模式,在匯編語言中將會表現為Model Small,此時兩種程序所用存儲模式為統一類型。由于小型存儲模式采用Near作為基礎指針,所以該存儲模式具有較高的運行效率,因此在實際的混合編程情況中,應在條件滿足的情況下盡可能選用小型存儲模式。
C語言程序的編譯過程中,程序中變量及函數名稱的下方會被添加一道下劃線,為確保連接質量,在調用子程序中,任意一種標示符的都需添加下劃線。從C語言程序的角度講,其會對調用對象中具體變量與函數予以偽命令,以此達到說明的目的,通常將命令放置在函數與變量的外部。另外,為了保存匯編語言程序中完整的標示符,還需使用PUBLIC操作符對指定標示符進行定義。如果匯編語言程序需使用 C語言程序中的函數,需要在所選函數的名稱前添加下劃線,同時在程序開始階段運用EXTERN語句進行說明,如圖2所示。

圖2 匯編語言程序訪問C語言程序函數
總之,匯編語言與 C語言的充分融合,打破了單一語言程序編程的局限性,兩種語言程序的特點均可得到充分的發揮,并在運行的過程中相互協調,通過參數傳遞功能,還可實現數據信息的共享,從而為相關軟件的開發提供良好的保障,使其更加安全可靠,推動了編程事業的全面快速發展。

表1 GPU與CPU下視頻編碼時間表
本系統為GOP級的并行編碼算法,它利用可編程GPU以及相應的計算統一設備架構CUDA對基于AVS標準的編碼器進行加速,實現了一個基于GPU的AVS并行編碼器。與基于CPU上的AVS并行編碼器相比,它在保證了視頻圖像質量同時,也在很大程度上提高了編碼的速率。
[1] 王濤.AVS視頻解碼器C語言建模研究[D].天津:天津大學,2008.
[2] 陳志波.H.264運動估值4網絡視頻傳輸關鍵問題研究[D].北京:清華大學,2003.
[3] 甘新標,沈立,王志英.基于CUDA的并行全搜索運動估計算法[J].計算機輔助設圖形學學報,2010,22(3):457-460.
[4] 張舒,褚艷利.GPU高性能運算之CUDAIM〕[M].北京:中國水利水電出版社,2009:2-141.
[5] AVS工作組.視頻編碼標準 AVS 技術介紹[J].電子產品世界,2005,(10):58-62.
[6] 蔣興昌,周軍,羅傳飛.H.264 并行編碼算法的研究[J].電視技術,2008,32(2):33-35.
Discussion about assembly language and C language programming techniques mixed
Assembly language is actually a form of language for the machine, with fast speed and less storage space, under certain conditions, the direct control of the hardware, in a variety of fields have been widely used and has to close important role. However, in the actual writing and debugging session, the difficulty and complexity are great, especially the hybrid operation links. C language with a high degree of flexibility and skills in software development aspects, the use of assembly language and C language programming mixed technology, not only can effectively solve the problems single-use assembly language processing the data, but also a substantial increase in the actual operating efficiency. Paper describes two specific methods of mixed programming languages, as well as the connection between the two in question should be noted, to lay the foundation for the promotion and application of hybrid programming techniques.
Assembly language; C language; hybrid programming
TP313
A
1008-1151(2015)02-0016-03
2015-01-11
蔣仁祥(1967-),福建平潭人,福建師范大學數學和計算機學院講師,研究方向為高校計算機教學。