單片機(jī)C語(yǔ)言與匯編語(yǔ)言混合編程_百度文庫(kù)_第1頁(yè)
單片機(jī)C語(yǔ)言與匯編語(yǔ)言混合編程_百度文庫(kù)_第2頁(yè)
單片機(jī)C語(yǔ)言與匯編語(yǔ)言混合編程_百度文庫(kù)_第3頁(yè)
單片機(jī)C語(yǔ)言與匯編語(yǔ)言混合編程_百度文庫(kù)_第4頁(yè)
單片機(jī)C語(yǔ)言與匯編語(yǔ)言混合編程_百度文庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 文章編號(hào):1004-5422(2008 03-0208-04單片機(jī)C 語(yǔ)言與匯編語(yǔ)言混合編程楊加國(guó)(成都大學(xué)電子信息工程學(xué)院, 四川成都610106摘要:介紹了單片機(jī)C 語(yǔ)言與匯編語(yǔ)言混合編程的兩種基本方式,C 語(yǔ)言程序中嵌入?yún)R編程序和調(diào)用匯編程序的參數(shù)傳遞方法, 以及在keil C51中的具體處理方法. 關(guān)鍵詞:混合編程; 嵌入?yún)R編; 編譯; 參數(shù)傳遞中圖分類(lèi)號(hào):TP314文獻(xiàn)標(biāo)識(shí)碼:A0引言, 編語(yǔ)言開(kāi)發(fā)程序. 硬件操作很方便, , 效率高, 但系統(tǒng)設(shè)計(jì)的周期長(zhǎng), 可讀性和可移植性都很差. C 語(yǔ)言程序開(kāi)發(fā)是近年來(lái)單片機(jī)系統(tǒng)開(kāi)發(fā)應(yīng)用所采用的主要開(kāi)發(fā)方式之一,C 語(yǔ)言功能豐富、表達(dá)能力強(qiáng)、

2、使用靈活方便、開(kāi)發(fā)周期短、可讀性強(qiáng)、可移植性好. 但是, 采用C 語(yǔ)言編程還是存在著如對(duì)硬件沒(méi)有匯編方便、效率沒(méi)有匯編高、編寫(xiě)延時(shí)程序精確度不高等缺點(diǎn), 因而現(xiàn)在單片機(jī)系統(tǒng)開(kāi)發(fā)中經(jīng)常用到C 語(yǔ)言與匯編語(yǔ)言混合編程技術(shù). 混合編程技術(shù)可以把C 語(yǔ)言和匯編語(yǔ)言的優(yōu)點(diǎn)結(jié)合起來(lái), 編寫(xiě)出性能優(yōu)良的程序. 單片機(jī)混合編程技術(shù)通常是, 程序的框架或主體部分用C 語(yǔ)言編寫(xiě), 對(duì)那些使用頻率高、要求執(zhí)行效率高、延時(shí)精確的部分用匯編語(yǔ)言編寫(xiě), 這樣既保證了整個(gè)程序的可1,2讀性, 又保證了單片機(jī)應(yīng)用系統(tǒng)的性能. 在單片機(jī)C 語(yǔ)言程序中嵌C51中的預(yù)處理指令#pragma asm endasm 語(yǔ)句實(shí)現(xiàn), 格式如

3、下:#pragma AS M ; 匯編程序代碼#pragma E NDAS M通過(guò)#pragma asm 和#pragma endasm 告訴C51編譯器它們之間的語(yǔ)句行不用編譯成匯編程序代碼. 1. 2在C51中調(diào)用匯編程序在C51中調(diào)用匯編程序的方法應(yīng)用較多,C 模塊與匯編模塊的接口較簡(jiǎn)單, 分別用C51與A51對(duì)源程序進(jìn)行編譯, 然后用L51將obj 文件連接即可, 關(guān)鍵問(wèn)題在于C 函數(shù)與匯編函數(shù)之間的參數(shù)傳遞和得到正確返回值, 以保證模塊間的數(shù)據(jù)交換.2C51與匯編程序的參數(shù)傳遞在C51中嵌入?yún)R編程序或調(diào)用匯編程序, 其參數(shù)傳遞的過(guò)程是不一樣的. 2. 1在C51中嵌入?yún)R編程序的參數(shù)傳

4、遞對(duì)于在C 語(yǔ)言程序中通過(guò)#pragma asm 和#pragma endasm 嵌入的匯編程序,C51編譯器在編譯時(shí)只是將當(dāng)中的匯編程序不編譯, 而不做其他任何處理, 因此不存在函數(shù)調(diào)用時(shí)的參數(shù)傳遞和返回值問(wèn)題. 如果要在C 程序中和匯編程序中實(shí)現(xiàn)數(shù)據(jù)傳遞, 可以通過(guò)變量或特殊功能寄存器來(lái)實(shí)現(xiàn), 例如, 在C 程序的變量定義部分定義Z 變量, 在C 語(yǔ)言程序和匯編程序中共同訪(fǎng)問(wèn)Z 變量, 這1混合編程的基本方式C 語(yǔ)言與匯編語(yǔ)言混合編程通常有兩種基本方法:在C 語(yǔ)言中嵌入?yún)R編程序和在C 語(yǔ)言中調(diào)用匯編程序. 1. 1在C51中嵌入?yún)R編程序在C51中嵌入?yún)R編程序主要用于實(shí)現(xiàn)延時(shí)或中斷處理, 以

5、便生成精練的代碼, 減少運(yùn)行時(shí)間. 嵌入式匯編通常用在當(dāng)匯編函數(shù)不大, 且內(nèi)部沒(méi)收稿日期:2008-05-08.作者簡(jiǎn)介:楊加國(guó)(1972 , 男, 碩士, 講師, 從事單片機(jī)應(yīng)用技術(shù)研究 1 第3期楊加國(guó):單片機(jī)C 語(yǔ)言與匯編語(yǔ)言混合編程樣,C 語(yǔ)言程序可以通過(guò)Z 變量把參數(shù)傳遞給匯編程序, 匯編程序可以通過(guò)Z 變量把參數(shù)返回給C 語(yǔ)言程序. 2. 2在C51中調(diào)用匯編程序的參數(shù)傳遞在C51中調(diào)用匯編程序是通過(guò)函數(shù)調(diào)用的形式來(lái)實(shí)現(xiàn)的. 由于C51程序函數(shù)有明確的參數(shù)和返回值約定, 因此在C51中調(diào)用匯編程序進(jìn)行參數(shù)傳遞時(shí)都必須嚴(yán)格遵守C51函數(shù)的參數(shù)和返回值相關(guān)約定.在C51中調(diào)用匯編程序進(jìn)

6、行參數(shù)傳遞關(guān)鍵在于要弄清C51函數(shù)的參數(shù)傳遞規(guī)則. 在C51中調(diào)用匯編程序進(jìn)行參數(shù)傳遞的方式有兩種:一種是通過(guò)寄存器傳遞參數(shù); 3,4遞. 2. 2. 1Franklin C5151單表2函數(shù)參數(shù)傳遞舉例聲明func1(int a func2(int b ,int c ,int 3d 209func3(long e , long f (g , h 說(shuō)明惟一一個(gè)參數(shù)a 在寄存器R6中和R7中傳遞.第一個(gè)參數(shù)b 在寄存器R6中和R7中傳遞, 第二個(gè)參數(shù)c 在寄存器R4中和R5中, 傳遞第三個(gè)參數(shù)d 在寄存器R1中、R2中和R3中傳遞. 第一個(gè)參數(shù)e 在寄存器R4中、R5中,R6中和R7中傳遞, 第

7、二個(gè)參數(shù)f 不能用寄存器, 因?yàn)閘ong 類(lèi)型可用的寄存器已被第一個(gè)參數(shù)所用, .g 在寄存器R4中、R5中傳遞, 第二個(gè)參數(shù)h , 只能用固定., ? function -name ? BY TE ”保存別的參, 即使通過(guò)寄存器傳遞參數(shù), 參數(shù)也將在這些段中分配空間, 參數(shù)按聲明的先后在每個(gè)段中順序保存.用做參數(shù)傳遞的固定存儲(chǔ)區(qū)可在內(nèi)部數(shù)據(jù)區(qū)或外部數(shù)據(jù)區(qū), 這由存儲(chǔ)模式?jīng)Q定. Small 模式的參數(shù)段用內(nèi)部數(shù)據(jù)區(qū),C om pact 和Large 模式用外部數(shù)據(jù)區(qū).2. 2. 3函數(shù)返回值.個(gè)參數(shù), 余下的通過(guò)固定存儲(chǔ)區(qū)傳遞. 可以用“NOREG PARMS ”命令取消用寄存器傳遞參數(shù), 如

8、果用寄存器傳遞參數(shù)取消或參數(shù)太多, 參數(shù)通過(guò)固定存儲(chǔ)區(qū)傳遞. 用寄存器傳遞參數(shù)的函數(shù)在生成代碼時(shí)被Cx51編譯器在函數(shù)名前加上一個(gè)下劃線(xiàn)“-”的前綴, 在固定存儲(chǔ)區(qū)傳遞參數(shù)的函數(shù)則沒(méi)有下劃線(xiàn).不同的參數(shù)用到的寄存器不一樣, 不同的數(shù)據(jù)類(lèi)型用到的寄存器也不同. 通過(guò)寄存器傳遞的參數(shù)如表1所示.表1傳遞參數(shù)用到的寄存器參數(shù)類(lèi)型第1個(gè)第2個(gè)第3個(gè)char R7R5R3int R6、R7R4、R5R2、R3long float R4R7R4R7函數(shù)返回值通常用寄存器傳遞, 表3列出了可能的返回值和所用的寄存器.表3函數(shù)返回值用到的寄存器返回值類(lèi)型Bit(unsigned char (unsigned

9、int (unsigned long float 通用指針寄存器C R7R6、R7R4R7R4R7R1、R2、R3無(wú)通用指針R1、R2、R3R1、R2、R3R1、R2、R3說(shuō)明由位運(yùn)算器C 返回在R7返回單個(gè)字節(jié)高位在R6, 低位在R7高位在R4, 低位在R732位IEEE 格式存儲(chǔ)類(lèi)型在R3, 高位在R2, 低位在R1表1中,int 型和long 型數(shù)據(jù)傳遞時(shí)高位數(shù)據(jù)在低位寄存器中, 低位數(shù)據(jù)在高位寄存器中;float 型數(shù)據(jù)滿(mǎn)足32位的IEEE 格式, 指數(shù)和符號(hào)位在R7中; 通用指針存儲(chǔ)類(lèi)型在R3中, 高位在R2中. 函數(shù)參數(shù)傳遞舉例情況如表2所示. 2. 2. 2通過(guò)固定存儲(chǔ)區(qū)傳遞.用

10、固定存儲(chǔ)區(qū)傳遞參數(shù)給匯編程序, 參數(shù)段首地址用段名“? function -name ? BY TE ”和“? function -name ? BIT ”保存,function -name 為函數(shù)的名稱(chēng), 其中“, ? function -name ? BIT ”保存位參數(shù)3C51中嵌入?yún)R編程序的實(shí)現(xiàn)方法通常, 在C51程序中嵌入?yún)R編程序的處理方法如下:第一步, 在C 文件中以如下方式嵌入?yún)R編程序.#pragma AS M ; 匯編程序#pragma E NDAS M第二步, 在keil C51軟件的Project 窗口右鍵單擊嵌入?yún)R編程序的C 文件, 選擇“Options for ”, 點(diǎn)

11、 成都大學(xué)學(xué)報(bào)(自然科學(xué)版 第27卷210擊右邊的“G enerate Assembler SRC File ”和“Assemble SRC File ”, 使檢查框由灰色變成黑色(有效 狀態(tài).第三步, 根據(jù)選擇的編譯模式, 把相應(yīng)的庫(kù)文件(如Small 模式時(shí), 是K eil C51Lib C51S. Lib 加入工程中, 該文件必須作為工程的最后文件. 庫(kù)文件與編譯模式的關(guān)系如下:C51S.LI B -沒(méi)有浮點(diǎn)運(yùn)算的Small m odel C51C.LI B -沒(méi)有浮點(diǎn)運(yùn)算的C om pact m odel C51L.LI B -沒(méi)有浮點(diǎn)運(yùn)算的Large m odel C51FPS.LI

12、 B -帶浮點(diǎn)運(yùn)算的Small m odel C51FPC.LI B -帶浮點(diǎn)運(yùn)算的C om pact m odel C51FP L.LI B -帶浮點(diǎn)運(yùn)算的Large m odel. a51就變成匯編程序 如下:NAME A1; 定義模塊名稱(chēng)? PR ? -max ? A1SEG ME NT CODE; 定義程序代碼PUBLIC -max ; 定義公共符號(hào); #define uchar unsigned char ;uchar max (uchar x ,uchar y RSEG ? PR ? -max ? A1; 程序代碼段-max :; 起始地址USING 0;S OURCE LINE

13、#2; y ? 041Register R5? R7第四步, 編譯, 即可生成目標(biāo)代碼.OURCE LINE #3; uchar z ; z =(x >=y ? x :y;4C51為了能夠在C , 要求匯.C51, 除了前面參數(shù)傳遞的相關(guān)規(guī)則外, 函數(shù)及其相關(guān)段也需要滿(mǎn)足一定的規(guī)則.一個(gè)C51源程序模塊被編譯后, 其中的每一個(gè)函數(shù)以“? PR ? 函數(shù)名? 模塊名”為名的命名規(guī)則被分配到一個(gè)獨(dú)立的C ODE 段. 例如, 如果模塊“FUNC51”內(nèi)包含一個(gè)名為“func ”的函數(shù), 則其C ODE 段的名字是“? PR ? FUNC ? FUNC51”, 如果; S OURCE LINE

14、 #5M OV A ,R7;R7中為第二個(gè)字節(jié)參數(shù)C LR CS UBB A ,R5;R5中為第一個(gè)字節(jié)參數(shù)JC ? C0001S JMP ? C0002? C0001:M OV R7,AR5;R7中為返回值? C0002:; Variable z ? 042assigned to Register R7; return (z ; S OURCE LINE #6; S OURCE LINE #7; ? C0003:函數(shù)中還包含有data 和bit 對(duì)象的局部變量, 編譯器將按“? 函數(shù)名? BY TE 和? 函數(shù)名? BIT ”命令規(guī)則建立一個(gè)data 和bit 段, 它們代表所要傳遞參數(shù)的起

15、始位置, 其偏移值為零. 段內(nèi)代碼與數(shù)據(jù)定義也遵循一定的規(guī)則. 這些段是公開(kāi)的, 它們的地址可被其他模塊訪(fǎng)問(wèn). 另外, 這些段被編譯器賦予“OVER LAY ABLE ”標(biāo)志, 其可被L51連接定位器做覆蓋分析.下面是一個(gè)簡(jiǎn)單的C51程序編譯時(shí)形成的匯編程序.C 語(yǔ)言源程序如下:#define uchar unsigned char uchar max (uchar x ,uchar y uchar z ;z =(x >=y ? x :y; return (z ; RET; E ND OF -maxE ND可以看出, 要編寫(xiě)為C51調(diào)用的匯編程序, 除了參數(shù)必須按前面規(guī)定的寄存器或存儲(chǔ)器

16、傳送外, 程序格式也有相應(yīng)的規(guī)則. 這些規(guī)則比較繁瑣, 在實(shí)際處理中往往按下面方式處理:第一步, 先用C 語(yǔ)言程序編寫(xiě)出程序框架, 如文件名為a1. c (注意參數(shù) .第二步, 在keil C51的Project 窗口中用右鍵單擊該C 語(yǔ)言文件, 在右鍵菜單中選擇“Options for ”, 點(diǎn)擊右邊的“G enerate Assembler SRCFile ”和“Assemble SRC File ”, 使檢查框由灰色變成黑色(有效 狀態(tài).第三步, 根據(jù)選擇的編譯模式, 把相應(yīng)的庫(kù)文件(如Small 模式時(shí), 是K eil C51Lib C51S.匯編后形成的SRC 文件(只須擴(kuò)展名改為

17、第3期楊加國(guó):單片機(jī)C 語(yǔ)言與匯編語(yǔ)言混合編程Lib 加入工程中, 該文件必須作為工程的最后文211件. 庫(kù)文件與編譯模式的關(guān)系如前面所述.第四步, 編譯后將會(huì)產(chǎn)生一個(gè)SRC 的文件, 將這個(gè)文件擴(kuò)展名改為AS M. 這樣就形成了可供C51程序調(diào)用的匯編程序. 隨后可在該文件的代碼段中加入所需指令代碼.第五步, 將該匯編程序與調(diào)用它的主程序一起加到工程文件中, 這時(shí)工程文件中不再需要原來(lái)的C 語(yǔ)言文件和庫(kù)文件, 主程序只需要在程序開(kāi)始處用EXTERN 對(duì)所調(diào)用的匯編程序中的函數(shù)作聲明, 主程序中可調(diào)用匯編程序中的函數(shù).混合編程的方法, 既可提高程序開(kāi)發(fā)的效率, 又可以很方便的操作單片機(jī)硬件;

18、既能保證整個(gè)程序的可讀性, 又能保證對(duì)硬件訪(fǎng)問(wèn)的精確性. 適當(dāng)?shù)挠煤肅 語(yǔ)言與匯編語(yǔ)言混合編程技術(shù), 就可以開(kāi)發(fā)出性能較好的單片機(jī)應(yīng)用程序.參考文獻(xiàn):1杜波, 李麗娜, 吳川. K C51與A51的混合編程J.(3 :65-6712. J.電子制作, ( -59, , 張凱. 單片機(jī)的C 語(yǔ)言應(yīng)用程序設(shè)5總結(jié)在單片機(jī)C , 應(yīng)用系統(tǒng)設(shè)計(jì)中, C 北京:北京航空航天大學(xué)出版社,200714李小洪. K eil S oftware 2Cx51編譯器用戶(hù)手冊(cè)Z.K eil S oftware ,20011Mixed Programming of C Language and Assemble Lan

19、guage for Single Chip MCUY ANG Jiaguo(C ollege of E lectronic and In formation Engineering ,Chengdu University ,Chengdu 610106,China Abstract :Tw o basic m ode of mixed programming of C language and assemble language for Single Chip MC U are introduced. The parameter trans fering ways for assemble language embeding and trans fering in the C language. Actually im plementations in keil c51are als o discnssed. K ey w o

溫馨提示

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

評(píng)論

0/150

提交評(píng)論