資源描述:
《C語言與匯編語言的混合編程課件.ppt》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、C語言與匯編語言的混合編程案例南通開放大學(xué)1.混合編程的實(shí)現(xiàn)KeilC51編譯器支持在C51程序中直接插入?yún)R編語言,也可以調(diào)用以匯編語言編寫的子程序。1.C51程序中嵌入?yún)R編程序有時(shí)需要在C51程序中嵌入用匯編語言編寫的一個(gè)小程序段,來對(duì)硬件進(jìn)行操作,提高程序的可靠性和靈活性。下面是C51文件中嵌入?yún)R編語言的一般步驟。第一步:通過預(yù)編譯命令“#pragmaasm”和“#pragmaendasm”在C語言代碼中插入?yún)R編語言代碼。1.混合編程的實(shí)現(xiàn)用C語言程序中插入?yún)R編語言延時(shí)程序的方法,編程實(shí)現(xiàn)從P1.1引腳輸出周期為2ms的方波(設(shè)ST
2、C12C5A60S2單片機(jī)系統(tǒng)時(shí)鐘頻率為12MHz)#includesbitP1_1=P1^1;voidmain(){while(1){P1_1=1;#pragmaasmMOVR7,#12;2TDEL:MOVR6,#250;2TDJNZR6,$;4TDJNZR7,DEL;4T#pragmaendasmP1_1=0;#pragmaasmMOVR7,#12DEL:MOVR6,#250DJNZR6,$DJNZR7,DEL#pragmaendasm}}1.混合編程的實(shí)現(xiàn)(續(xù))第二步:在KeilC51環(huán)境下,在Projec
3、t窗口中包含匯編代碼的C文件上單擊右鍵,在彈出的快捷菜單中選擇“Optionsfor…”命令,再點(diǎn)擊選中右邊的“GenerateAssemblerSRCFile”和“AssemblerSRCFile”復(fù)選框,使檢查框由灰色(無效)變成黑色(有效)狀態(tài)。1.混合編程的實(shí)現(xiàn)(續(xù))1.混合編程的實(shí)現(xiàn)(續(xù))勾選GenerateAssemblerSRCFile和AssembleSRCFile1.混合編程的實(shí)現(xiàn)(續(xù))第三步:根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時(shí),是KeilC51LibC51S.Lib)加入到工程中,該文件必須
4、作為工程的最后文件。如果沒有做這一步編譯,則會(huì)出現(xiàn)如下警告“UNRESOLVEDEXTERNALSYMBOL”。1.混合編程的實(shí)現(xiàn)1.混合編程的實(shí)現(xiàn)(續(xù))庫文件與編譯模式的關(guān)系如下:C51S.LIB_沒有浮點(diǎn)運(yùn)算的Small模式C51C.LIB_沒有浮點(diǎn)運(yùn)算的Compact模式C51L.LIB_沒有浮點(diǎn)運(yùn)算的Large模式C51FPS.LIB_帶浮點(diǎn)運(yùn)算的Small模式C51FPC.LIB_帶浮點(diǎn)運(yùn)算的Compact模式C51FPL.LIB_帶浮點(diǎn)運(yùn)算的Large模式第四步:編譯,生成目標(biāo)代碼。2.C51與匯編函數(shù)的相互調(diào)用與原理無論是
5、C51調(diào)用匯編函數(shù),還是匯編調(diào)用C51函數(shù),其操作是完全一致的。當(dāng)我們需要利用函數(shù)進(jìn)行混合編程時(shí),只需分別用C語言和匯編語言把函數(shù)寫好,然后在C語言程序(匯編程序)中調(diào)用匯編函數(shù)(C函數(shù))。也可以先用C語言編寫所有的代碼,包括需要匯編語言實(shí)現(xiàn)的部分,然后采用編譯控制指令SRC對(duì)需要匯編語言實(shí)現(xiàn)的函數(shù)進(jìn)行編譯,編譯后將產(chǎn)生一個(gè)與C文件同名的匯編語言源文件,該文件的擴(kuò)展名為.SRC,根據(jù)需要再對(duì)該文件進(jìn)行精煉、修改。2.1混合項(xiàng)目文件編程混合項(xiàng)目文件編程就是把用C語言編寫的程序保存為擴(kuò)展名為.C的C語言文件,把用匯編語言編寫的程序保存為擴(kuò)展
6、名為.asm、.SRC或者.A51的匯編語言文件,然后把這些文件導(dǎo)入到同一個(gè)工程下進(jìn)行編譯連接的方法。在C語言中調(diào)用匯編程序時(shí),對(duì)被調(diào)用函數(shù)(匯編語言函數(shù))要在主調(diào)函數(shù)(C語言函數(shù))所在文件中作出聲明,并且對(duì)匯編語言程序有以下要求:要使用SEGMENT偽指令定義可再定位的CODE段。要根據(jù)不同情況對(duì)函數(shù)名進(jìn)行轉(zhuǎn)換,見表1。要使用PUBLIC偽指令將被調(diào)用函數(shù)說明為外部可用函數(shù)。若有參數(shù)傳遞,按照表3所列的規(guī)則使用參數(shù)。若有返回值,按照表4所列規(guī)則存入寄存器。2.1混合項(xiàng)目文件編程(續(xù))編程實(shí)現(xiàn)從單片機(jī)P1.0引腳輸出周期為4ms的方波,
7、同時(shí)從P1.1引腳輸出周期為8ms的方波(設(shè)單片機(jī)系統(tǒng)時(shí)鐘頻率為12MHz)。分析:分別用匯編語言和C語言設(shè)計(jì)3個(gè)模塊程序如下:模塊1:用C語言編寫主程序,使P1.1引腳輸出周期為8ms的方波;模塊2:用C語言編程,使P1.0引腳輸出周期為4ms的方波;模塊3:用匯編語言編寫延時(shí)1ms的程序。程序執(zhí)行時(shí)用模塊1調(diào)用模塊2獲得8ms方波,模塊2調(diào)用模塊3,并向匯編程序傳遞字符型參數(shù)(x=2),實(shí)現(xiàn)2ms延時(shí)。3.混合編程模塊1(文件名pulse1.c):#include#defineucharunsignedcha
8、rsbitP1_1=P1^1;externvoiddelay4ms(void);//外部函數(shù)delay4ms()聲明voidmain(){while(1){P1_1=0;delay4ms();//調(diào)用模塊2