51單片機asm與C混合編程-設計應用_第1頁
51單片機asm與C混合編程-設計應用_第2頁
51單片機asm與C混合編程-設計應用_第3頁
51單片機asm與C混合編程-設計應用_第4頁
51單片機asm與C混合編程-設計應用_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

精品文檔-下載后可編輯單片機asm與C混合編程-設計應用在單片機應用系統(tǒng)設計中,過去主要采用匯編語言開發(fā)程序。匯編語言編寫的程序?qū)纹瑱C硬件操作很方便,編寫的程序代碼短,效率高,但系統(tǒng)設計的周期長,可讀性和可移植性都很差。C語言程序開發(fā)是近年來單片機系統(tǒng)開發(fā)應用所采用的主要開發(fā)方式之一,C語言功能豐富、表達能力強、使用靈活方便、開發(fā)周期短、可讀性強、可移植性好。但是,采用C語言編程還是存在著如對硬件沒有匯編方便、效率沒有匯編高、編寫延時程序度不高等缺點,因而現(xiàn)在單片機系統(tǒng)開發(fā)中經(jīng)常用到C語言與匯編語言混合編程技術?;旌暇幊碳夹g可以把C語言和匯編語言的優(yōu)點結合起來,編寫出性能優(yōu)良的程序。單片機混合編程技術通常是,程序的框架或主體部分用C語言編寫,對那些使用頻率高、要求執(zhí)行效率高、延時的部分用匯編語言編寫,這樣既保證了整個程序的可讀性,又保證了單片機應用系統(tǒng)的性能。1、混合編程的基本方式C語言與匯編語言混合編程通常有兩種基本方法:在C語言中嵌入?yún)R編程序和在C語言中調(diào)用匯編程序。1.1在C51中嵌入?yún)R編程序在C51中嵌入?yún)R編程序主要用于實現(xiàn)延時或中斷處理,以便生成精練的代碼,減少運行時間。嵌入式匯編通常用在當匯編函數(shù)不大,且內(nèi)部沒有復雜的跳轉的時候。在單片機C語言程序中嵌入?yún)R編程序是通過C51中的預處理指令#pragmaasm/endasm語句實現(xiàn),格式如下:#pragmaASM;匯編程序代碼#pragmaENDASM通過#pragmaasm和#pragmaendasm告訴C51編譯器它們之間的語句行不用編譯成匯編程序代碼。1.2在C51中調(diào)用匯編程序在C51中調(diào)用匯編程序的方法應用較多,C模塊與匯編模塊的接口較簡單,分別用C51與A51對源程序進行編譯,然后用L51將obj文件連接即可,關鍵問題在于C函數(shù)與匯編函數(shù)之間的參數(shù)傳遞和得到正確返回值,以保證模塊間的數(shù)據(jù)交換。2、C51與匯編程序的參數(shù)傳遞在C51中嵌入?yún)R編程序或調(diào)用匯編程序,其參數(shù)傳遞的過程是不一樣的。2.1在C51中嵌入?yún)R編程序的參數(shù)傳遞對于在C語言程序中通過#pragmaasm和#pragmaendasm嵌入的匯編程序,C51編譯器在編譯時只是將當中的匯編程序不編譯,而不做其他任何處理,因此不存在函數(shù)調(diào)用時的參數(shù)傳遞和返回值問題。如果要在C程序中和匯編程序中實現(xiàn)數(shù)據(jù)傳遞,可以通過變量或特殊功能寄存器來實現(xiàn),例如,在C程序的變量定義部分定義Z變量,在C語言程序和匯編程序中共同訪問Z變量,這樣,C語言程序可以通過Z變量把參數(shù)傳遞給匯編程序,匯編程序可以通過Z變量把參數(shù)返回給C語言程序。2.2在C51中調(diào)用匯編程序的參數(shù)傳遞在C51中調(diào)用匯編程序是通過函數(shù)調(diào)用的形式來實現(xiàn)的。由于C51程序函數(shù)有明確的參數(shù)和返回值約定,因此在C51中調(diào)用匯編程序進行參數(shù)傳遞時都必須嚴格遵守C51函數(shù)的參數(shù)和返回值相關約定。在C51中調(diào)用匯編程序進行參數(shù)傳遞關鍵在于要弄清C51函數(shù)的參數(shù)傳遞規(guī)則。在C51中調(diào)用匯編程序進行參數(shù)傳遞的方式有兩種:一種是通過寄存器傳遞參數(shù);一種是通過固定存儲區(qū)傳遞。2.2.1通過寄存器傳遞參數(shù)。FranklinC51規(guī)定調(diào)用函數(shù)多可通過51單片機的工作寄存器傳遞3個參數(shù),余下的通過固定存儲區(qū)傳遞??梢杂谩癗OREGPARMS”命令取消用寄存器傳遞參數(shù),如果用寄存器傳遞參數(shù)取消或參數(shù)太多,參數(shù)通過固定存儲區(qū)傳遞。用寄存器傳遞參數(shù)的函數(shù),在生成代碼時被Cx51編譯器在函數(shù)名前加上一個下劃線“_”的前綴,在固定存儲區(qū)傳遞參數(shù)的函數(shù)則沒有下劃線。不同的參數(shù)用到的寄存器不一樣,不同的數(shù)據(jù)類型用到的寄存器也不同。通過寄存器傳遞的參數(shù)如表1所示。

表1中,int型和long型數(shù)據(jù)傳遞時高位數(shù)據(jù)在低位寄存器中,低位數(shù)據(jù)在高位寄存器中;float型數(shù)據(jù)滿足32位的IEEE格式,指數(shù)和符號位在R7中;通用指針存儲類型在R3中,高位在R2中。函數(shù)參數(shù)傳遞舉例情況如表2所示。

2.2.2通過固定存儲區(qū)傳遞。用固定存儲區(qū)傳遞參數(shù)給匯編程序,參數(shù)段首地址用段名“function-nAMEBYTE”和“function-name?BIT”保存,function-name為函數(shù)的名稱,其中“,?function-name?BIT”保存位參數(shù)段首地址,“function-nameBYTE”保存別的參數(shù)段首地址,即使通過寄存器傳遞參數(shù),參數(shù)也將在這些段中分配空間,參數(shù)按聲明的先后在每個段中順序保存。用做參數(shù)傳遞的固定存儲區(qū)可在內(nèi)部數(shù)據(jù)區(qū)或外部數(shù)據(jù)區(qū),這由存儲模式?jīng)Q定。Small模式的參數(shù)段用內(nèi)部數(shù)據(jù)區(qū),Compact和Large模式用外部數(shù)據(jù)區(qū)。2.2.3函數(shù)返回值。函數(shù)返回值通常用寄存器傳遞,表3列出了可能的返回值和所用的寄存器。3、C51中嵌入?yún)R編程序的實現(xiàn)方法通常,在C51程序中嵌入?yún)R編程序的處理方法如下:步,在C文件中以如下方式嵌入?yún)R編程序。#pragmaASM;匯編程序#pragmaENDASM第二步,在keilC51軟件的Project窗口右鍵單擊嵌入?yún)R編程序的C文件,選擇“Optionsfor?”,點擊右邊的“GenerateAssemblerSRCFile”和“AssembleSRCFile”,使檢查框由灰色變成黑色(有效)狀態(tài)。第三步,根據(jù)選擇的編譯模式,把相應的庫文件(如Small模式時,是Keil\C51\Lib\C51S。Lib)加入工程中,該文件必須作為工程的文件。庫文件與編譯模式的關系如下:C51S.LIB-沒有浮點運算的SmallmodelC51C.LIB-沒有浮點運算的CompactmodelC51L.LIB-沒有浮點運算的LargemodelC51FPS.LIB-帶浮點運算的SmallmodelC51FPC.LIB-帶浮點運算的CompactmodelC51FPL.LIB-帶浮點運算的Largemodel第四步,編譯,即可生成目標代碼。keil軟件中c編程如何制作一個庫函數(shù)并在其他地方隨意調(diào)用?在項目的Output設置中選擇輸出lib而不是可執(zhí)行目標文件。4、C51中調(diào)用匯編程序的實現(xiàn)方法為了能夠在C語言中調(diào)用匯編程序,要求匯編程序的編寫必須符合C語言的相關命名規(guī)則。C51程序在調(diào)用匯編程序時,除了前面參數(shù)傳遞的相關規(guī)則外,函數(shù)及其相關段也需要滿足一定的規(guī)則。一個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段,它們代表所要傳遞參數(shù)的起始位置,其偏移值為零。段內(nèi)代碼與數(shù)據(jù)定義也遵循一定的規(guī)則。這些段是公開的,它們的地址可被其他模塊訪問。另外,這些段被編譯器賦予“OVERLAYABLE”標志,其可被L51連接P定位器做覆蓋分析。下面是一個簡單的C51程序編譯時形成的匯編程序。C語言源程序如下:#defineucharunsignedcharucharmax(ucharx,uchary){ucharz;z=(x=y)?x:y;return(z);}匯編后形成的SRC文件(只須擴展名改為.a51就變成匯編程序)如下:NAMEA1;定義模塊名稱?PR?_max?A1SEGMENTCODE;定義程序代碼PUBLIC_max;定義公共符號;#defineucharunsignedchar;ucharmax(ucharx,uchary)RSEG?PR?_max?A1;程序代碼段_max:;起始地址USING0;SOURCELINE#2;??Variable’y?041’assignedtoRegister’R5’??;??Variable’x?040’assignedtoRegister’R7’??;{;SOURCELINE#3;ucharz;;z=(x=y)?x:y;;SOURCELINE#5MOVA,R7;R7中為第二個字節(jié)參數(shù)CLRCSUBBA,R5;R5中為個字節(jié)參數(shù)JC?C0001SJMP?C0002?C0001:MOVR7,AR5;R7中為返回值?C0002:;??Variable’z?042’assignedtoRegister’R7’??;return(z);;SOURCELINE#6;SOURCELINE#7;}?C0003:RET;ENDOF-maxEND可以看出,要編寫為C51調(diào)用的匯編程序,除了參數(shù)必須按前面規(guī)定的寄存器或存儲器傳送外,程序格式也有相應的規(guī)則。這些規(guī)則比較繁瑣,在實際處理中往往按下面方式處理:步,先用C語言程序編寫出程序框架,如文件名為a1.c(注意參數(shù))。第二步,在keilC51的Project窗口中用右鍵單擊該C語言文件,在右鍵菜單中選擇“Optionsfor?”,點擊右邊的“GenerateAssemblerSRCFile”和“AssembleSRCFile”,使檢查框由灰色變成黑色(有效)狀態(tài)。第三步,根據(jù)選擇的編譯模式,把相應的庫文件(如Small模式時,是Keil\C51\Lib\C51S.Lib)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論