




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
重點(diǎn)內(nèi)容:程序設(shè)計(jì)及編程方法KeilC51和A51接口編程基礎(chǔ)C與匯編語言混合編程實(shí)現(xiàn)模塊化程序設(shè)計(jì)本章小結(jié)第6章C與匯編語言混合編程一、程序設(shè)計(jì)及編程方法無論是高級語言還是匯編語言,源程序都要轉(zhuǎn)換成目標(biāo)代碼(機(jī)器語言)單片機(jī)才能執(zhí)行。在Kell中程序的編譯過程如圖6.1所示。C語言程序經(jīng)過c51編譯器、匯編語言程序經(jīng)過匯編器編譯后可以產(chǎn)生浮動地址目標(biāo)程序,經(jīng)過連接定位器生成十六進(jìn)制的可執(zhí)行文件。1、單片機(jī)程序編制過程二、KeilC51和A51接口編程基礎(chǔ)1.A51中的段A51中的代碼及數(shù)據(jù)分為不同的段,各段及功能如表6-1所示。1、宏匯編器A51二、KeilC51和A51接口編程基礎(chǔ)A51中保留了些關(guān)鍵字如表6-2所示。1、宏匯編器A51二、KeilC51和A51接口編程基礎(chǔ)2.A51中的偽指令宏匯編器A51有一些偽指令,可以讓我們定義符號值,預(yù)留和初始化內(nèi)存,以及控制代碼的位置。下面主要介紹在混合編程中會經(jīng)常碰到的程序連接偽指令和段偽指令。(1)程序連接偽指令程序連接偽指令可以使我們通過允許模塊間的引用和和模塊的命名來實(shí)現(xiàn)各模塊之間通信。①PUBLIC偽指令PUBLIC列出將在其它目標(biāo)模塊中使用的符號。偽指令PUBLIC使指定符號在生成的目標(biāo)模塊中可用。這實(shí)際上就是把這些符號的名稱公用化。偽指令PUBLIC的格式如下:PUBLIC符號PUBLIC指令后可以指定多個(gè)符號名,各個(gè)名字之間用逗號隔開。例如:PUBLICTimer0_Init//指定一個(gè)外部可以使用的函數(shù)名。1、宏匯編器A51二、KeilC51和A51接口編程基礎(chǔ)②EXTERN/EXTRNEXTERN/EXTRN指令與PUBLIC指令對應(yīng),如果要使用其他模塊中的符號,則必須用EXTERN/EXTRN指令進(jìn)行說明。指令格式為:EXTRNclass:type(symbol,symbol...)EXTERNclass:type(symbol,symbol...)class是該符號被定義處的存儲空間類型,可以是下列類型之一:BIT,CODE,CONST,DATA,EBIT,ECONST,EDATA,ECODE,HDATA,HCONST,IDATA,XDATA,或NUMBER(聲明一個(gè)無類型符號);type是外部符號的符號類型,可以是下列類型之一:BYTE,WORD,DWORD,NEAR,FAR。symbol是一個(gè)外部符號名。例如:EXTRNCODE(PUT_CRLF),DATA(BUFFER)EXTERNCODE(BINASC,ASCBIN)EXTRNNUMBER(TABLE_SIZE)EXTERNCODE:FAR(main)EXTRNEDATA:BYTE(VALUE,COUNT)EXTRNNCONST:DWORD(LIMIT)通過以上指令說明后,本程序段中才可以訪問外部變量。1、宏匯編器A513. C51函數(shù)的參數(shù)傳遞規(guī)則無論是高級語言還是匯編語言,源程序都要轉(zhuǎn)換成目標(biāo)代碼(機(jī)器語言)單片機(jī)才能執(zhí)行。L1=0;//點(diǎn)亮燈voidmain(void)1、C語言中嵌入?yún)R編語言下面主要介紹在混合編程中會經(jīng)常碰到的程序連接偽指令和段偽指令。在大型一些的項(xiàng)目中,需要匯編語言實(shí)現(xiàn)的功能比較復(fù)雜時(shí),這時(shí)需要用匯編語言編寫函數(shù),此時(shí)就要用到C51程序調(diào)用匯編函數(shù)的方法。需要說明的是,用戶不必先寫匯編函數(shù)的C代碼,而是直接寫匯編語言代碼,然后完成C51與匯編函數(shù)的相互調(diào)用。ucharfunc(ucharx,uchary);/*函數(shù)func原型聲明*/DTESEGMENTCODE;選擇DTE為當(dāng)前段本章主要介紹了單片機(jī)的混合編程,詳細(xì)介紹了單片機(jī)的混合編程的原理、C51/A51的相關(guān)知識以及C語言匯編語言混合編程的三種形式。ucharfunc(ucharx,uchary);/*函數(shù)func原型聲明*/delay(50);//延時(shí)二、KeilC51和A51接口編程基礎(chǔ)這些段是公開的,因而它們的地址可被其它模塊訪問。二、KeilC51和A51接口編程基礎(chǔ)③NAMENAME指令用來標(biāo)識當(dāng)前模塊。指令格式為:NAME目標(biāo)模塊名目標(biāo)模塊名最多可包含40個(gè)字符,此模塊名與對應(yīng)該模塊的文件名無關(guān),每個(gè)模塊只能有一個(gè)模塊名,如果源程序中沒有給出模塊名,則以不帶擴(kuò)展名的文件名做為模塊名。(2)段偽指令一個(gè)段是一個(gè)代碼或數(shù)據(jù)存儲塊,它根據(jù)匯編器從x51匯編源文件中的代碼或數(shù)據(jù)創(chuàng)建。我們在源模塊中怎樣使用段,取決于我們的應(yīng)用的復(fù)雜度。較小的應(yīng)用需要較少的存儲空間,一般比大型多模塊應(yīng)用的復(fù)雜度低。下面分別介紹。①RSEG(RelocatableSegment)RSEG為再定位段指令,用于選擇一個(gè)已經(jīng)在前面定義的再定位段做為當(dāng)前段。指令格式為:RSEG段名段名必須是在前面已經(jīng)聲明過了的可再定位段。1、宏匯編器A51二、KeilC51和A51接口編程基礎(chǔ)1.C51函數(shù)名的轉(zhuǎn)換及其命名規(guī)則C51程序模塊編譯成目標(biāo)文件后,其中的函數(shù)名依據(jù)其定義的性質(zhì)不同會轉(zhuǎn)換為不同的函數(shù)名,因此,在C和匯編程序的相互調(diào)用中,要求匯編程序必須服從這種函數(shù)名的轉(zhuǎn)換規(guī)則,否則,將無法調(diào)用到所需的函數(shù)或出現(xiàn)錯(cuò)誤。C51中函數(shù)名的轉(zhuǎn)換規(guī)則如表6-3所列。2、C51編譯器二、KeilC51和A51接口編程基礎(chǔ)2. C51函數(shù)及其相關(guān)段的命名規(guī)則一個(gè)C51源程序模塊被編譯后,其中的每一個(gè)函數(shù)以“?PR?函數(shù)名?模塊名”為名的命名規(guī)則被分配到一個(gè)獨(dú)立的CODE段。例如,如果模塊“FUNC51”內(nèi)包含一個(gè)名為“func”的函數(shù),則其CODE段的名字是“?PR?FUNC?FUNC51”。如果一個(gè)函數(shù)包含有data和bit對象的局部變量,編譯器將按“?函數(shù)名?BYTE和?函數(shù)名?BIT”命令規(guī)則建立一個(gè)data和bit段,它們代表所要傳遞參數(shù)的起始位置,其偏移值為零。這些段是公開的,因而它們的地址可被其它模塊訪問。另外,這些段被編譯器賦予“OVERLAYABLE”標(biāo)志,故可被L51連接/定位器作覆蓋分析。依賴于所使用的存儲器模式,這些段的段名按表6-4所列規(guī)則命名,在相互調(diào)用時(shí),匯編語言必須服從C51有關(guān)段名的命名規(guī)則。2、C51編譯器二、KeilC51和A51接口編程基礎(chǔ)2. C51函數(shù)及其相關(guān)段的命名規(guī)則一個(gè)C51源程序模塊被編譯后,其中的每一個(gè)函數(shù)以“?PR?函數(shù)名?模塊名”為名的命名規(guī)則被分配到一個(gè)獨(dú)立的CODE段。例如,如果模塊“FUNC51”內(nèi)包含一個(gè)名為“func”的函數(shù),則其CODE段的名字是“?PR?FUNC?FUNC51”。如果一個(gè)函數(shù)包含有data和bit對象的局部變量,編譯器將按“?函數(shù)名?BYTE和?函數(shù)名?BIT”命令規(guī)則建立一個(gè)data和bit段,它們代表所要傳遞參數(shù)的起始位置,其偏移值為零。這些段是公開的,因而它們的地址可被其它模塊訪問。另外,這些段被編譯器賦予“OVERLAYABLE”標(biāo)志,故可被L51連接/定位器作覆蓋分析。依賴于所使用的存儲器模式,這些段的段名按表6-4所列規(guī)則命名,在相互調(diào)用時(shí),匯編語言必須服從C51有關(guān)段名的命名規(guī)則。2、C51編譯器二、KeilC51和A51接口編程基礎(chǔ)3. C51函數(shù)的參數(shù)傳遞規(guī)則在C51中調(diào)用匯編程序進(jìn)行參數(shù)傳遞關(guān)鍵在于要弄清C51函數(shù)的參數(shù)傳遞規(guī)則.在C51中調(diào)用匯編程序進(jìn)行參數(shù)傳遞的方式有兩種:一種是通過寄存器傳遞參數(shù);一種是通過固定存儲區(qū)傳遞。(1)通過寄存器傳遞參數(shù)C和匯編接口的關(guān)鍵在于要弄清C函數(shù)的參數(shù)傳遞規(guī)則。KeilC51具有特定的參數(shù)傳遞規(guī)則,這就為二者的接口提供了條件。KeilC51函數(shù)最多可通過CPU寄存器傳遞三個(gè)參數(shù),這種傳遞技術(shù)的優(yōu)點(diǎn)是可產(chǎn)生與匯編語言相比的高效代碼。表6-5是利用寄存器傳遞參數(shù)的規(guī)則。表6-5中,int型和long型數(shù)據(jù)傳遞時(shí)高位數(shù)據(jù)在低位寄存器中,低位數(shù)據(jù)在高位寄存器中;float型數(shù)據(jù)滿足32位的IEEE格式,指數(shù)和符號位在R7中;通用指針存儲類型在R3中,高位在R2中。2、C51編譯器二、KeilC51和A51接口編程基礎(chǔ)函數(shù)參數(shù)傳遞舉例情況如表6-6所示。2、C51編譯器二、KeilC51和A51接口編程基礎(chǔ)(2)通過固定存儲區(qū)傳遞如果參數(shù)較多而使得寄存器不夠用時(shí),部分參數(shù)將在固定的存儲區(qū)域內(nèi)傳送,這種混合的情況有時(shí)會令用戶在弄清每一個(gè)參數(shù)的傳遞方式時(shí)發(fā)生困難。如果在源程序中選擇了編譯控制命令“#pragmaNOREGPARMS”,則所有參數(shù)傳遞都發(fā)生在固定的存儲區(qū)域,所使用的地址空間依賴于所選擇的存儲器模式。這種參數(shù)傳遞技術(shù)的優(yōu)點(diǎn)是傳遞途徑非常清晰,缺點(diǎn)是代碼效率不高,速度較慢。用固定存儲區(qū)傳遞參數(shù)給匯編程序,參數(shù)段首地址用段名“?function-name?BYTE”和“?function-name?BIT”保存,function-name為函數(shù)的名稱,其中“,?function-name?BIT”保存位參數(shù)段首地址,“?function-name?BYTE”保存別的參數(shù)段首地址,即使通過寄存器傳遞參數(shù),參數(shù)也將在這些段中分配空間,參數(shù)按聲明的先后在每個(gè)段中順序保存。用做參數(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、C51編譯器二、KeilC51和A51接口編程基礎(chǔ)(3)函數(shù)返回值當(dāng)函數(shù)具有返回值時(shí),也需傳遞參數(shù),這種返回值參數(shù)的傳遞均是通過CPU內(nèi)部寄存器完成,其傳遞規(guī)則如表6-7所示。2、C51編譯器二、KeilC51和A51接口編程基礎(chǔ)【例6-1】C51的函數(shù)名轉(zhuǎn)換規(guī)則、段命名規(guī)則及參數(shù)傳遞規(guī)則舉例。/*------------------------------------------------------------功能:計(jì)算x/y--------------------------------------------------------------*/#include<reg51.h>#defineucharunsignedcharucharfunc(ucharx,uchary);/*函數(shù)func原型聲明*/voidmain(void)/*主函數(shù)*/{func(0x12,0x34);/*調(diào)用函數(shù)func*/}ucharfunc(ucharx,uchary)/*函數(shù)func*/{return(x/y);/*計(jì)算x/y并返回結(jié)果*/}2、C51編譯器二、KeilC51和A51接口編程基礎(chǔ);**************************************************************;文件名:ASM.SRC;說明:此文件是ASM.C編譯后的匯編輸出文件(限于篇幅,有所省略);**************************************************************?PR?main?ASMSEGMENTCODE;主函數(shù)main代碼段聲明?PR?_func?ASMSEGMENTCODE;函數(shù)func代碼段聲明PUBLIC_func;公開函數(shù)名以便可被其它模塊調(diào)用PUBLICmainRSEG?PR?main?ASMmain:;主函數(shù)代碼段起始;;{;func(0x12,0x34);MOVR7,#02H;R7傳遞第一個(gè)char參數(shù)MOVR5,#034H;R5傳遞第二個(gè)char參數(shù)LCALL_func;調(diào)用函數(shù)func;}RET;返回;ucharfunc(ucharx,uchary)RSEG?PR?_func?ASM_func:;函數(shù)func代碼段起始;{;return(x/y);MOVA,R7;計(jì)算x/yMOVB,R5DIVABMOVR7,A;結(jié)果經(jīng)R7返回;}RET;返回END;結(jié)束2、C51編譯器三、C與匯編語言混合編程實(shí)現(xiàn)下面是C51文件中嵌入?yún)R編語言的一般步驟:①通過預(yù)編譯指令“#pragnaasm”和“#pragmaasm”在C語言代碼中插入?yún)R編語言代碼,如:#include<at89x51.h>voidmain(void){….#pragmaasm//從此處插入?yún)R編代碼…...#pragmaendasm//結(jié)束匯編代碼…..}1、C語言中嵌入?yún)R編語言三、C與匯編語言混合編程實(shí)現(xiàn)②在Project窗口中包含匯編代碼的C文件上右鍵,選擇“Optionsfor...”命令,點(diǎn)擊選擇右邊的“GenerateAssemblerSRCFile”和“AssembleSRCFile”,使檢查框由灰色變成黑色狀態(tài),設(shè)置完成之后的對話框如圖6.2所示。1、C語言中嵌入?yún)R編語言三、C與匯編語言混合編程實(shí)現(xiàn)注意,如果沒有做這一步編譯時(shí)會出現(xiàn)如下錯(cuò)誤:'asm/endasm'requiressrc-controltobeactive,無法通過編譯。③根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時(shí),是Keil\C51\Lib\C51S.Lib)加入工程中,該文件必須作為工程的最后文件。如果沒有做這一步編譯時(shí)會出現(xiàn)如下警告:“UNRESOLVEDEXTERNALSYMBOL”。④編譯,即可生成目標(biāo)代碼。1、C語言中嵌入?yún)R編語言三、C與匯編語言混合編程實(shí)現(xiàn)前面介紹了在C51程序中直接嵌入?yún)R編語言的方法,這適合匯編代碼比較短的場合。在大型一些的項(xiàng)目中,需要匯編語言實(shí)現(xiàn)的功能比較復(fù)雜時(shí),這時(shí)需要用匯編語言編寫函數(shù),此時(shí)就要用到C51程序調(diào)用匯編函數(shù)的方法。當(dāng)然,有時(shí)候也需要用匯編調(diào)用C51函數(shù)。無論是C51調(diào)用匯編函數(shù),還是匯編調(diào)用C51函數(shù),其操作是完全一致的。當(dāng)我們需要利用函數(shù)進(jìn)行混合編程時(shí),只需分別用C語言和匯編語言把函數(shù)寫好,然后在C語言程序(匯編程序)中調(diào)用匯編函數(shù)(C函數(shù))。當(dāng)然我們也可以通過后面6.3.4的內(nèi)容來編寫匯編程序,這樣大大減少了編程的時(shí)間,提高了效率。詳細(xì)互調(diào)方法大家可以結(jié)合6.3.4節(jié)并參考實(shí)驗(yàn)6-1進(jìn)行學(xué)習(xí)。2、C語言與匯編函數(shù)的互調(diào)三、C與匯編語言混合編程實(shí)現(xiàn)【例6-2】在keil中建立C和混合項(xiàng)目編程混合。首先我們新建一個(gè)工程,工程名為hunhe,在keil中建立C語言文件的項(xiàng)目讀者已經(jīng)非常熟悉了,只需要編制所需要的匯編語言程序并將其加入到項(xiàng)目中就可以了。建立如下程序:PUBLIC_DELAY;公共符號定義DTESEGMENTCODE;選擇DTE為當(dāng)前段RSEGDTE_DELAY: NOPDELA:MOVR1,#0F8H;延時(shí)LOP1:NOPNOPDJNZR1,LOP1DJNZR7,DELA;R7為C程序傳遞過來的參數(shù)EXIT: RETEND 3、混合項(xiàng)目文件編程三、C與匯編語言混合編程實(shí)現(xiàn)上面這個(gè)程序?yàn)橐粋€(gè)用匯編程序編寫的延時(shí)程序,將其保存為hunhe.A51。同時(shí)還用C編寫一個(gè)程序,保存為Delay.c。程序清單如下:#include<reg52.H>externvoiddelay(unint)sbitL1=P1^3;//定義p1.3口輸出即p1.3的SFR voidmain(void){unsignedchari=0;while(1){L1=0;//點(diǎn)亮燈delay(50);//延時(shí)L1=1;//熄滅燈delay(50);//延時(shí)}}3、混合項(xiàng)目文件編程三、C與匯編語言混合編程實(shí)現(xiàn)C51編譯器提供了一個(gè)十分有用的編譯控制指令“SRC”,在編寫匯編語言程序時(shí)可以先按需要用C語言編寫相應(yīng)的函數(shù),對該函數(shù)采用編譯控制指令SRC進(jìn)行編譯,編譯后將產(chǎn)生一個(gè)匯編語言源文件,該文件的擴(kuò)展名為SRC,文件名與相應(yīng)的C文件同名。在工作區(qū)的某個(gè)文件上點(diǎn)擊右鍵,彈出如圖6.4所示。4、Keil中的編譯控制命令SRC三、C與匯編語言混合編程實(shí)現(xiàn)選擇“Optionsforfile‘hunhe.c’”選項(xiàng),出現(xiàn)如圖6.5所示的對話框。然后將“GeneratedAssemblerSRCFile”前的勾劃上并點(diǎn)擊確定,編譯連接之后就會自動生成后綴為SRC的匯編文件。4、Keil中的編譯控制命令SRC三、C與匯編語言混合編程實(shí)現(xiàn)【例6-3】用帶SRC選項(xiàng)的命令對C文件進(jìn)行編譯。首先編寫的C程序如下:#include<reg52.H>voidmain(void){longi=0;while(1){L1=0;//點(diǎn)亮燈for(i=0;i<2540;i++);//延時(shí)L1=1;//熄滅燈for(i=0;i<2540;i++);//延時(shí)}}4、Keil中的編譯控制命令SRC三、C與匯編語言混合編程實(shí)現(xiàn)【例6-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 八年級地理上冊 第四章 中國的經(jīng)濟(jì)發(fā)展 第一節(jié) 交通運(yùn)輸 第2課時(shí) 我國鐵路干線的分布教學(xué)設(shè)計(jì) (新版)新人教版
- 3學(xué)會自我保護(hù) (公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì))統(tǒng)編版道德與法治七年級下冊
- 2創(chuàng)新永無止境 公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)(表格式)-1
- UTF-8‘’Brand KPIs for ready-made-food Aunt Bessie's in the United Kingdom-外文版培訓(xùn)課件(2025.2)
- 微量泵使用與護(hù)理
- 案例分析1人感染高致病性禽流感疫情52
- 收藏品質(zhì)押借款合同
- 倉庫租賃買賣合同樣本
- 軟件開發(fā)合同技術(shù)創(chuàng)新目標(biāo)
- 《探求知識的互聯(lián)互通》課件
- NBT47013渦流檢測通用工藝規(guī)程
- 2024年陸上石油天然氣開采安全管理考試題庫附答案
- 北師大版 數(shù)學(xué) 二年級下冊 單元測試卷
- 工會會計(jì)賬務(wù)處理智能系統(tǒng)
- 差異表達(dá)基因分析5趨勢性上調(diào)和下調(diào)基因分析6基因集功
- 程序文件流程培訓(xùn)
- 車工工藝與技能訓(xùn)練(第3版)PPT完整全套教學(xué)課件
- 廠房租賃合同參考
- 講培訓(xùn)轉(zhuǎn)化為商業(yè)結(jié)果版
- 【幼兒園家園合作的現(xiàn)狀及對策研究7400字(論文)】
- 五一勞動節(jié)假期安全教育培訓(xùn)課件
評論
0/150
提交評論