在KEILC51中嵌入?yún)R編及C51和A51間的相互調(diào)用_第1頁
在KEILC51中嵌入?yún)R編及C51和A51間的相互調(diào)用_第2頁
在KEILC51中嵌入?yún)R編及C51和A51間的相互調(diào)用_第3頁
在KEILC51中嵌入?yún)R編及C51和A51間的相互調(diào)用_第4頁
在KEILC51中嵌入?yún)R編及C51和A51間的相互調(diào)用_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

在KEILC51中嵌入?yún)R編及C51和A51間的相互調(diào)用.來源:域名注冊o域名驚喜價格cn域名1元注冊ocom域名39.9元虛擬主機o主機按月支付,低至19元/月o超大流量,可開子站點VPS主機o特惠VPS168元/月,4-8M獨享帶寬保證o獨立操作系統(tǒng),無限開站點甌1怎么在KEILC51(v6.21)中調(diào)用匯編函數(shù)的一個示例[ycong_kuang]有關(guān)c51調(diào)用匯編的方法已有非常多帖子講到,不過一般只講要點,非常少有對整個過程作周詳描述,對于初學(xué)者是不夠的,這里筆者通過一個簡單例子對這個過程進行描述,希望能對初學(xué)者有所幫助。幾年來,在這個論壇里筆者得到非常多熱心人指導(dǎo),因此也希望藉此盡一點綿薄之力。在這個例子里,闡述了編寫c51程式調(diào)用匯編函數(shù)的一種方法,這個外部函數(shù)的入口參數(shù)是個字符型變量和一個位變量,返回值是一個整型變量。例中,先用c51寫出這個函數(shù)的主體,然后用SRC控制指令編譯產(chǎn)生asm文件,進一步修改這個asm文件就得到我們所要的匯編函數(shù)。該方法讓編譯器自動完成各種段的安排,提高了匯編程式的編寫效率。step1.按寫普通c51程式方法,建立工程,在里面導(dǎo)入main.c文件和CFUNC.c文件。相關(guān)文件如下://main.c文件#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintexternuintAFUNC(ucharv_achrbitv_bflag);voidmain()(bitBFLAG;ucharmav_chr;uintmvintrslt;mav_chr=0xd4;BFLAG=1;mvintrslt=AFUNC(mav_chrBFLAG);}//CFUNC.c文件#defineucharunsignedchar#defineuintunsignedintuintAFUNC(ucharv_achrbitv_bflag)(uchartmp_vchr;uinttp_vint;tmp_vchr=v_achr;tp_vint=(uint)v_bflag;returntmp_vchr+(tp_vint<<8);}step2.在Project窗口中包含匯編代碼的C文件上右鍵,選擇“Optionsfor...”,點擊右邊的“GenerateAssemblerSRCFile”和“AssembleSRCFile”,使檢查框由灰色變成黑色(有效)狀態(tài);step3.根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時,是Keil\C51\Lib\C51S.Lib)加入工程中,該文件必須作為工程的最后文件;step4.build這個工程后將會產(chǎn)生一個CFUNC.SRC的文件,將這個文件改名為CFUNC.A51(也能通過編譯選項直接產(chǎn)生CFUNC.A51文件),然后在工程里去掉庫文件(如C51S.Lib)和CFUNC.c而將CFUNC.A51添加到工程里。//CFUNC.SRC文件如下.\CFUNC.SRCgeneratedfrom:CFUNC.cNAMECFUNC?PR?_AFUNC?CFUNCSEGMENTCODE?BI?_AFUNC?CFUNCSEGMENTBITOVERLAYABLEPUBLIC?AFUNC?BITRSEG?BI?_AFUNC?CFUNC?_AFUNC?BIT:v_bflag?041:DBIT1;#defineucharunsignedchar;#defineuintunsignedint;;uintAFUNC(ucharv_achrbitv_bflag)RSEG?PR?_AFUNC?CFUNC_AFUNC:USING0;SOURCELINE#5;----Variable'v_achr?040'assignedtoRegister'R7'----;(;SOURCELINE#6;uchartmp_vchr;;uinttp_vint;;;tmp_vchr=v_achr;;SOURCELINE#10;----Variable'tmp_vchr?042'assignedtoRegister'R5'----MOVR5AR7;tp_vint=(uint)v_bflag;;SOURCELINE#11MOVCv_bflag?041CLRARLCA;----Variable'tp_vint?043'assignedtoRegister'R6/R7'----;returntmp_vchr+(tp_vint<<8);;SOURCELINE#12MOVR6AMOVR4#00HCLRAADDAR5MOVR7AMOVAR4ADDCAR6MOVR6A;};SOURCELINE#13?C0001:RET;ENDOF_AFUNCENDstep5.檢查main.c的“GenerateAssemblerSRCFile”和“AssembleSRCFile”是否有效,若是有效則點擊使檢查框變成無效狀態(tài);再次build這個工程,到此你已得到匯編函數(shù)的主體,修改函數(shù)里面的匯編代碼就得到你所需的匯編函數(shù)了。參考文獻:徐愛鈞,彭秀華。單片機高級語言C51windows環(huán)境編程和應(yīng)用,電子工業(yè)出版社C51編程:關(guān)于在KEILC51中直接嵌入?yún)R編。。。帖子編號:83838發(fā)表用戶:Youthkeil中匯編函數(shù)調(diào)用c51函數(shù)[ycong_kuang]在keil的寫法可參考89852帖子,具體如下:和89852帖子相比,第一步在工程里多了一個被匯編調(diào)用的c51的函數(shù)文件(c51func.c),至于匯編函數(shù)還是先用c51編寫出主體(a51func.c),這樣匯編程式接口和段都交給編譯器處理,你只管在編譯成匯編代碼后按你的需求改寫匯編代碼就行了。例程如下://main.c#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintexternuintAFUNC(ucharv_achrbitv_bflag);voidmain()(bitBFLAG;ucharmav_chr;uintmvintrslt;mav_chr=0xd4;BFLAG=1;mvintrslt=AFUNC(mav_chrBFLAG);}//a51FUNC.c#defineucharunsignedchar#defineuintunsignedintexternuintCFUNC(uint);uintAFUNC(ucharv_achrbitv_bflag)//c51寫的匯編函數(shù),最終要變成匯編代碼(uchartmp_vchr;uinttp_vint;tmp_vchr=v_achr;tp_vint=(uint)v_bflag;returnCFUNC(tp_vint);//這里調(diào)用一個c51函數(shù)}//c51FUNC.c#defineucharunsignedchar#defineuintunsignedintuintCFUNC(uintv_int)//被匯編函數(shù)調(diào)用c51函數(shù)(returnv_int<<2;}第二步是按89852帖子的step234color=#00aa66>;.\a51func.SRCgeneratedfrom:a51func.cNAMEA51FUNC?PR?_AFUNC?A51FUNCSEGMENTCODE?DT?_AFUNC?A51FUNCSEGMENTDATAOVERLAYABLE?BI?_AFUNC?A51FUNCSEGMENTBITOVERLAYABLEEXTRNCODE(_CFUNC)PUBLIC?_AFUNC?BITPUBLIC_AFUNCRSEG?DT?_AFUNC?A51FUNC?_AFUNC?BYTE:tmp_vchr?042:DS1RSEG?BI?_AFUNC?A51FUNC?_AFUNC?BIT:v_bflag?041:DBIT1;//a51FUNC.c;#defineucharunsignedchar;#defineuintunsignedint5;externuintCFUNC(uint);;;uintAFUNC(ucharv_achrbitv_bflag)RSEG?PR?_AFUNC?A51FUNC_AFUNC:;c51所寫的函數(shù)產(chǎn)生的匯編代碼從這里開始USING0;SOURCELINE#8;----Variable'v_achr?040'assignedtoRegister'R7'----;(;SOURCELINE#9;uchartmp_vchr;;uinttp_vint;;;tmp_vchr=v_achr;;SOURCELINE#13MOVtmp_vchr?042R7;tp_vint=(uint)v_bflag;;SOURCELINE#14MOVCv_bflag?041CLRAMOVR6ARLCAMOVR7A;----Variable'tp_vint?043'assignedtoRegister'R6/R7'----;這里說明R6R7內(nèi)容就是tp_vint;returnCFUNC(tp_vint);;SOURCELINE#16LCALL_CFUNC這里調(diào)用了用c51寫的函數(shù);};SOURCELINE#17?C0001:RET;ENDOF_AFUNCEND這個文件就是你的匯編函數(shù)所在文件,把函數(shù)里面的匯編代碼修改成你所需的匯編函數(shù)就ok了。建議參考徐愛鈞,彭秀華所寫的《單片機高級語言C51windows環(huán)境編程和應(yīng)用》或馬忠梅所寫的《單片機的c語言應(yīng)用程式設(shè)計》有關(guān)混合語言編程有關(guān)章節(jié)關(guān)于在KEILC51中直接嵌入?yún)R編。。。[Youth]有時在C51程式中需要嵌入一些匯編代碼,這時當然能用通常的作法:按照C51和匯編的接口寫一個匯編函數(shù),然后在C51程式中調(diào)用該函數(shù)。(此種方法可在論壇里搜索,以前有非常多帖子講到,不再重復(fù))下面介紹直接嵌入?yún)R編代碼的方法:1、在C文件中要嵌入?yún)R編代碼片以如下方式加入?yún)R編代碼:#pragmaASM;AssemblerCo

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論