資源描述:
《C語言與匯編語言的混合編程概述課件.ppt》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、C語言與匯編語言的混合編程概述南通開放大學1.C51與匯編語言混合編程概述在一個應(yīng)用程序中,根據(jù)每個任務(wù)的具體特點和要求,用不同的編程語言編寫源程序,最后通過編譯/連接器生成一個可執(zhí)行的完整程序,這種編程方式稱為混合編程。匯編語言特點:優(yōu)點:執(zhí)行速度快、效率高、實時性強、與硬件結(jié)合緊密。缺點:編程難度大、可讀性差,不便于移植、開發(fā)時間長。C語言特點:優(yōu)點:編程容易、可移植性強、支持多種數(shù)據(jù)類型,能直接對硬件進行操作,效率高。缺點:實時處理弱于匯編語言,無法準確定時?;旌暇幊烫攸c:效率高、速度快、易于編程、可讀性、可移植性好,使用范圍
2、廣。1.C51與匯編語言混合編程概述(續(xù))單片機程序的編譯過程無論是C語言還是匯編語言,源程序都要被轉(zhuǎn)換成目標代碼(機器語言),單片機才能識別。在單片機混合編程中,C模塊與匯編模塊的接口簡單,分別用C51和A51對源文件進行編譯,然后經(jīng)連接定位器L51產(chǎn)生可下載到程序存儲器的十六進制可執(zhí)行文件。2.C51和A51程序接口基礎(chǔ)C語言與匯編語言程序的連接,在技術(shù)上有兩個問題:一個是C語言程序與匯編語言程序如何相互調(diào)用;另一個是C語言程序和匯編語言程序如何實現(xiàn)相互之間的數(shù)據(jù)傳遞?;旌暇幊讨?,必須約定兩個規(guī)則,即命名規(guī)則和參數(shù)傳遞規(guī)則。C5
3、1函數(shù)名的轉(zhuǎn)換及其命名規(guī)則C51程序模塊編譯成目標文件后,其中的函數(shù)名要依據(jù)其定義的性質(zhì)轉(zhuǎn)換為相應(yīng)不同的函數(shù)名。因此,在C和匯編程序的相互調(diào)用中,要求匯編程序必須服從這種函數(shù)名的轉(zhuǎn)換規(guī)則,否則將無法調(diào)用到所需的函數(shù)甚至出現(xiàn)錯誤。C51中函數(shù)名的轉(zhuǎn)換規(guī)則如表1所示,其匯編符號名全部轉(zhuǎn)換為大寫。2.C51和A51程序接口基礎(chǔ)表1C51中函數(shù)名的轉(zhuǎn)換規(guī)則C51函數(shù)聲明匯編符號名說明voidfunc1(void)FUNC1無參數(shù)傳遞或不含寄存器的函數(shù),名稱不作改變直接轉(zhuǎn)入目標文件中。voidfunc2(char)_FUNC2通過寄存器傳遞參
4、數(shù),函數(shù)名加前綴“_”voidfunc3(void)reentrant_?FUNC3重入函數(shù),通過堆棧傳遞參數(shù),函數(shù)名加前綴“_?”2.C51和A51程序接口基礎(chǔ)一個C51源程序模塊被編譯后,其中的每個函數(shù)以“?PR?函數(shù)名?模塊名”為命名規(guī)則被分配到一個獨立的CODE段。例如,如果模塊“FUNC51”內(nèi)包含一個名為“func”的函數(shù),則其CODE段的名字是“?PR?FUNC?FUNC51”。如果一個函數(shù)包含有data或bit類型的局部變量,編譯器將按“?函數(shù)名?BYTE”或“?函數(shù)名?BIT”命名規(guī)則建立一個data或bit段,它
5、們代表所要傳遞參數(shù)的起始位置,其偏移量為0。這些段是公開的,因而它們的地址可以被其它模塊訪問。這些段被編譯器賦予“OVERLAYABLE”標志,可被L51連接/定位器作覆蓋分析。依據(jù)所使用的存儲器模式,這些段按表2所列規(guī)則命名,在相互調(diào)用時,匯編語言必須服從C51有關(guān)段名的命名規(guī)則。2.C51和A51程序接口基礎(chǔ)表2各種存儲模式下C51函數(shù)段名的命名規(guī)則數(shù)據(jù)段類型段名程序代碼CODE?PR?函數(shù)名?模塊名(所有存儲器模式)局部變量DATA?DT?函數(shù)名?模塊名(SMALL模式)PDATA?PD?函數(shù)名?模塊名(COMPACT模式)X
6、DATA?XD?函數(shù)名?模塊名(LARGE模式)局部bit變量BIT?BIT?函數(shù)名?模塊名(所有存儲器模式)3.C51函數(shù)的參數(shù)傳遞規(guī)則C51中調(diào)用匯編程序時參數(shù)傳遞有兩種方式,一種是通過寄存器傳遞,一種是通過固定存儲區(qū)傳遞。1.通過寄存器傳遞參數(shù)KeilC51規(guī)定,調(diào)用函數(shù)時,通過寄存器最多可傳遞3個參數(shù),余下的通過固定存儲區(qū)傳遞。如果在源程序中采用了編譯控制命令“#pragmaNOREGPARMS”,則所有參數(shù)傳遞都發(fā)生在固定的存儲區(qū)域,所使用的地址空間依賴于所選擇的存儲模式。用寄存器傳遞參數(shù)的函數(shù)在編譯時被C51編譯器在函數(shù)
7、名前加了一個“_”的前綴,用固定存儲區(qū)傳遞參數(shù)的函數(shù)轉(zhuǎn)換成的函數(shù)名沒有下劃線,如表1所示。不同的參數(shù)用到的寄存器不一樣,不同的數(shù)據(jù)類型用到的寄存器也不同。表3是利用寄存器傳遞參數(shù)的規(guī)則。3.C51函數(shù)的參數(shù)傳遞規(guī)則表3C51利用寄存器傳遞參數(shù)規(guī)則參數(shù)類型charintlong/float通用指針第1個參數(shù)R7R6、R7R4-R7R1-R3第2個參數(shù)R5R4、R5無R1-R3第3個參數(shù)R3R2、R3無R1-R3其中,int型和long型數(shù)據(jù)傳遞時,低地址寄存器中放數(shù)據(jù)的高位字節(jié),高地址寄存器中放數(shù)據(jù)的低位字節(jié);float型數(shù)據(jù)滿足IE
8、EE格式,R4中存放階碼和符號位,尾數(shù)按從高位到低位的順序依次存放在寄存器R5、R6和R7中;通用指針的存儲類型存放在R3中,高位在R2,低位在R1如果某一函數(shù)的形式參數(shù)有兩個或更多,當發(fā)生寄存器沖突時,后者改為通過固定存儲區(qū)傳遞。3