版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、keilC語言與匯編語言混合編程1、在C文件中要嵌入?yún)R編代碼片以如下方式加入?yún)R編代碼:ttpragmaASMAssemblerCodeHerettpragmaENDASM2、在Project窗口中包含匯編代碼的C文件上右鍵,選擇Optionsfor”FileEditViewProjectFlashDebugPeripheralsToolsSVCSWindowIDS/Project一35Target1二SourceGroup1fEl!QJ)/適CA5MC:.園瀚delay,a01incLude02defineucharunsignelaylOOiSMKInna.一-.1-1|懇OptionsFo
2、rFileC_ASM.C.Alt+F7xata|*Open匸_A5M.COpen.C_ASM.Ist畫OpenMapFile11Rebuildalltargetfiles_3BuildtargetF7】TranslateC.ASM.CStopbuildfAddGroup.】川DFFHOFFH?rirarrrtr?s(void)(D_LOOF;OFFH,DLOOF點(diǎn)擊右邊的uGenerateAssemblerSRCFilen和“AssembleSRCFile使檢査框由灰色變成黑色(有效)狀態(tài)OptionsforFileC.ASI.rProperties|C51Path:E:MYTASKXSSRS
3、IGNALDISTURB1O1111KEILCASMCASM.Crinclude:inTargetBwild廠AlwaysBuild0GenerateAssemblerSRCFileFileType:|cSourcefileFSize:|487Bteslastchange:|SatNov1314:16:462010VAssembleSRCFile廠LinkPublicsOnly3、根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時(shí),是KeilC51LibC51S.Lib)加入工程中,該文件必須作為工程的最后文件,在默認(rèn)安裝盤KEIL/C51/LIB/C51S.LibAddFilestoGr
4、oup*SourceGroupV查挨范圍Q):IQUBF5=0-詡C51BC.LZBC51BFFC.UBC51BFPL.LIE00C51BFFS.UB一一C51BL.LIBC5IBS.LIB_C51C.LIB審C51DS2A.LIB00C51DS2T.UEQpC51FPC.LIBRIBno5?C51FPL.LIBC51FPS.LIBijple51rripc.libluplc51infpl.libluplG51frips.lib亟|cSliril.libijplc51iti5.libfigC511IC.LIBC51HFPC.口Ei嗣C51HFPL.LIE00C51HFFS.口E匝JC51HL.L
5、IB函C51NS.LIBC51S.UB函C51L.LIBijple51me.Lib審CD51C.LIB匝JCD51FFC.口E亟CD51FPL.LXBSgCD5iFFS.m匝CD51L.LIBQ0CD51S.LIBQgjCHSIC.LIB亟CH51FFC.UB亟CHS1FPL.LTB審CH51FPS.LIB00CH51L.LIB嗣CH51S.LIBDJCSSIC.LIBQgjCS51FPC.LJB審CS51FPL.LIBnpiCSSIFFS.mjJHCSSlL.UB$CS51S.IIB審CX51C.UB審CX51FFC.UFQgCX51FPL.LIBQCX51FFS.LJE30CX51L.UB
6、邨15IS.LIBgplKTXSlBT.LJBQgjKTX51TNY.LJBAdd二IClseI文件名:|C51S.LIB文件類型(T):jLibraryfile4、編譯,即可生成目標(biāo)代碼來個(gè)實(shí)例吧:ttincludettdefineucharunsignedcharsbitLED1二Pl0:/*材*材*材*材*材*材*材*材*材*材*材*c嵌入?yún)R編例程材*材*材*材*材*材*材*材*材*材*材*材*/voiddelay_ms(void)ttpragmaasmMOVRO,#OFFHMOVRl,#OFFHD.L00P1:DJNZRO,D_LOOP1MOVRO,tiOFFHDJNZRl,D_LOO
7、P1ttpragmaendasmvoidmain(void)uchari;Pl=OxFF;while(1)i+;delay_ms();if(i=7)LED1=LED1;i二0;2.無參數(shù)傳遞的函數(shù)調(diào)用C51調(diào)用匯編函數(shù)1無參數(shù)傳遞的函數(shù)調(diào)用先來個(gè)例子:其中C_ASM.c和DELAY,a為項(xiàng)目中的兩個(gè)文件/*柯*柯*柯*柯*材*C_ASM.c*材*材*材/#includetidefineucharunsignedcharexternvoiddelayl00();sb譏LEDl=Pri;/*材*材*材*材*材*材*材*材*材*材*材*C嵌入?yún)R編例程材*材*材*材*材*材*材*材*材*材*材*材*/
8、voidmain(void)uchari;Pl=OxFF;while(1)i+:delayl00();if(i=7)LED1=LED1;i=0;;*材*材*材*材*材*DELAY1OO.a*?PR?DELAY1OOSEGMENTCODE;在程序存儲(chǔ)區(qū)中定義段PUBLICDELAY1OO:聲明函數(shù)RSEG7PR7DELAY100;函數(shù)可被連接器放置在任何地方DELAY1OO:MOVRO,#OFFHMOVRl,tiOFFHD_LOOP1:DJNZRO,D_LOOP1MOVRO,tiOFFHDJNZRl,D_LOOP1RETEND在C_ASM.c文件中,先聲明外部函數(shù),然后直接在main中調(diào)用即可。
9、在DELAY1OO.a中,?PR?DELAY1OOSEGMENTCODE;作用是在程序存儲(chǔ)區(qū)中定義段,DELAY100為段名,?PR?表示段位于程序存儲(chǔ)區(qū)內(nèi)PUBLICDELAY100:作用是聲明函數(shù)為公共函數(shù)RSEG?PR?DELAY1OO;表示函數(shù)可被連接器放置在任何地方,RSEG是段名的屬性段厲的開頭為PR,是為了和C51內(nèi)部命厲轉(zhuǎn)換兼容,命厲轉(zhuǎn)換規(guī)律如下:CODE-?PR?XDATA-7XDDATA-7DTBIT-7BIPDATA-7PD3.有參數(shù)傳遞的函數(shù)調(diào)用記住哦,c文件和A51文件不能使用同一個(gè)文件名,不過我還不知道為什么會(huì)這樣,有高手知道得話請(qǐng)告知。今天說說帶參數(shù)傳遞的函數(shù)調(diào)用
10、,在C51和匯編之間傳遞參數(shù)的方式有兩種,一種是通過寄存器傳遞參數(shù),C51中不同類型的實(shí)參會(huì)存入相應(yīng)的寄存器,在匯編中只需對(duì)相應(yīng)寄存器進(jìn)行操作,即達(dá)到傳遞參數(shù)的目的。不同類型的數(shù)據(jù)及其傳遞參數(shù)的寄存器如下表所示:在C和匯編混合編程的時(shí)候,存在C語言和匯編語言的變量以及函數(shù)的接口問題。在C程序中定義的變量,編譯為.asm文件后,都被放進(jìn)了.bss區(qū),而且變量名的前面都帶了一個(gè)下劃線。在C程序中定義的函數(shù),編譯后在函數(shù)名前也帶了一個(gè)下劃線。例如:externintnum就會(huì)變成bss_num,1externfloatnums5就會(huì)變成bss_nums,5externvoidfunc()就會(huì)變成_f
11、unc,匯編和c的相互調(diào)用可以分以下兒種情況:(1)匯編程序中訪問C程序中的變量和函數(shù)。在匯編程序中,用_xx就可以訪問c中的變量XXTo訪問數(shù)組時(shí),可以用_xx+偏移量來訪問,如_XX+3訪問了數(shù)組中的XX3o在匯編程序調(diào)用C函數(shù)時(shí),如果沒有參數(shù)傳遞,直接用_funcname就可以了。如果有參數(shù)傳遞,則函數(shù)中最左邊的一個(gè)參數(shù)由寄存器A給出,其他的參數(shù)按順序由堆棧給出。返回值是返回到A寄存器或者由A寄存器給出的地址。同時(shí)注意,為了能夠讓匯編語言能訪問到C語言中定義的變量和函數(shù),他們必須聲明為外部變量,即加extern前綴。(2)c程序中訪問匯編程序中的變量如果需耍在0程序中訪問匯編程序中的變量
12、,則匯編程序中的變量名必須以下劃線為首字符,并用global使之成為全局變量。如果需耍在0程序中調(diào)用匯編程序中的過程,則過程名必須以下劃線為首字符,并且,要根據(jù)c程序編譯時(shí)使用的模式是stack-basedmodel還是registerargumentmodel來正確地編寫該過程,使之能正確地取得調(diào)用參數(shù)。(3)在線匯編在C程序中直接插入asm(“*材”),內(nèi)嵌匯編語句,需要注意的是這種用法耍慎用,在線匯編提供了能直接讀寫硬件的能力,如讀寫中斷控制允許寄存器等,但編譯器并不檢査和分析在線匯編語言,插入在線匯編語言改變匯編環(huán)境或可能改變C變量的值可能導(dǎo)致嚴(yán)重的錯(cuò)誤。匯編和C接口中尋址方式的改變:
13、需要注意的是,在C語言中,對(duì)于局部變量的建立和訪問,是通過堆棧實(shí)現(xiàn)的,它的尋址是通過堆棧寄存器SP實(shí)現(xiàn)的。而在匯編語言中,為了使程序代碼變得更為精簡(jiǎn),TI在直接尋址方式中,地址的低7位直接包含在指令中,這低7位所能尋址的具體位置可由DP寄存器或SP寄存器決定。具體實(shí)現(xiàn)可通過設(shè)置ST1寄存器的CPL位實(shí)現(xiàn),CPL二0,DP尋址,CPL二1,SP尋址。在DP尋址的時(shí)候,由DP提供高9位地址,與低7位組成16位地址;在SP尋址的時(shí)候,16位地址是由SP(16位)與低7位直接相加得來。由于在C語言的環(huán)境下,局部變量的尋址必須通過SP寄存器實(shí)現(xiàn),在混合編程的時(shí)候,為了使匯編語言不影響堆棧寄存器SP,通常
14、的方式是在匯編環(huán)境中使用DP方式尋址,這樣可以使二者互不干擾。編程中只耍注意對(duì)CPL位正確設(shè)置即可1.word的意思就相當(dāng)與C語言里的int,char等定義一個(gè)變兩的寬度2.編譯錯(cuò)誤原因有2:如果在匯編里面定義.global(全局符號(hào)),那么在C語言里面應(yīng)該用extern聲明,以引用該符號(hào)。在匯編里面聲明的時(shí)候,符號(hào)前應(yīng)加下劃線,如FIQ_Addr:.wordEXTint_FI0應(yīng)為:FIQ_Addr:.word_EXTint_FIQ在C語言里面血用extern聲明。易外,一中方法是,用.ref代global來聲明符號(hào),這樣就不用在C源程序里面用extern聲明了。兩種方法結(jié)果相同。我講的是用
15、C和匯編混編程用法,至于C卄變量如何翻譯成匯編符號(hào)可以用仿真器,自己去看,原則類似.匯編與C語言混合編程的關(guān)鍵問題1C程序變量與匯編程序變量的共用為了使程序更易于接口和維護(hù),可以在匯編程序中引用與C程序共享的變量:.ref_to_dce_num,_todte_num,_to_dce_buff,_to_dte_buff在匯編程序中引用而在C程序可氏接定義的變量:unsignedcharto_dte_buffBUFF_SIZE;/DSP發(fā)向PC機(jī)的數(shù)據(jù)intto_dte_num;緩沖區(qū)中存放的有效字節(jié)數(shù)intto_dte_store;緩沖區(qū)的存放指針intto_dte_read;緩沖區(qū)的讀取指針這
16、樣經(jīng)過鏈接就可以完成對(duì)應(yīng)。2程序入口問題在C程序中,程序的入口是main()函數(shù)。而在匯編程序中其入口由*.cmd文件中的命令決定,如:-emain_start:程序入口地址為main_starto這樣,混合匯編出來的程序得不到正術(shù)結(jié)果。因?yàn)镃到ASM的匯編有默二的入口c-intOO,從這開始的一段程序?yàn)镃程序的運(yùn)行做準(zhǔn)備匚作。這些工作包括初始化變量、設(shè)置棧指針等,相當(dāng)于系統(tǒng)殼不能跨越。這時(shí)可在*.cmd文件中去掉語句:-emain.starto如仍想執(zhí)行某些匯編程序,可以C函數(shù)的形式執(zhí)行,如:main_start();其中含有其他匯編程序但前提是在匯編程序中ffi_main_start作為首地址,程序以rete結(jié)尾(作為可調(diào)用的函數(shù))的程序段,并在匯編程序中引用_main_start,即.ref_main_starta3移位問題在C語言中把變量設(shè)為char型時(shí),它是8位的,但在DSP匯編中此變量仍被作為16位處理。所以會(huì)出現(xiàn)在C程序中的移位結(jié)果與匯編程序移位結(jié)果不同的問題。解決的辦法是在C程序中,把移位結(jié)果再用0X00FF去“與”一下即可。4堆棧問
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《韻律操-搏擊操》教學(xué)設(shè)計(jì)-人教版《體育與健康》七年級(jí)全一冊(cè)
- 人教版初中體育與健康 九年級(jí) 第四章 籃球原地單手肩上投籃 教案
- 【核心素養(yǎng)目標(biāo)】第6課《中國(guó)畫的形式美》教案
- 小學(xué)高年級(jí)課后服務(wù) scratch3.0編程教學(xué)設(shè)計(jì) 一階第11課 智能相冊(cè)-特效相冊(cè)教學(xué)設(shè)計(jì)
- 籃球原地運(yùn)球(教案) 體育四年級(jí)下冊(cè)
- 外研版(2019)必修第一冊(cè) Unit 5 Into the Wild Understanding ideas 教學(xué)設(shè)計(jì)
- 《技術(shù)與設(shè)計(jì)2》第四章第二節(jié)理解控制系統(tǒng)教學(xué)設(shè)計(jì)
- 西師大版四年級(jí)音樂上冊(cè) 欣賞課《春之聲圓舞曲》教案
- DB5105-T 69-2024 雙稻雙蝦克氏原螫蝦、羅氏沼蝦稻田養(yǎng)殖技術(shù)規(guī)范
- 跑與游戲 教學(xué)設(shè)計(jì) 小學(xué)一致二年級(jí)體育
- 大米加工商業(yè)計(jì)劃書
- 13875界面設(shè)計(jì)自考復(fù)習(xí)試題庫(含答案)
- 常規(guī)試油工藝
- 高中物理人教版選修一 課后習(xí)題練習(xí)與應(yīng)用復(fù)習(xí)與提高 (含答案)
- 2024患者十大安全目標(biāo)
- (2024年)全新插畫設(shè)計(jì)課件
- 2023年福建省考評(píng)員考試題
- 《醫(yī)院預(yù)算管理》課件
- 實(shí)驗(yàn)室儀器借用登記表
- 數(shù)據(jù)庫完整性課件
- 2024全國(guó)職業(yè)院校技能大賽ZZ060母嬰照護(hù)賽項(xiàng)規(guī)程+賽題
評(píng)論
0/150
提交評(píng)論